Suvestinė
Šis naujinimas išsprendžia metaduomenų kodavimo problemą, dėl kurios nemokami garso kodeko (FLAC) muzikos failai tampa nepakartoti, jei pakeičiamas jų pavadinimas, atlikėjas ar kiti metaduomenys.
Priežastis
Ši problema gali kilti, kai FLAC failuose yra ID3 rėmelis prieš FLAC antraštę. ID3 rėmelyje yra metaduomenų, pvz., pavadinimas ir atlikėjas. Flac ypatybių apdorojimo programa padarė prielaidą, kad visi FLAC failai prasidėjo nuo 4 byte pradžios kodo fLaC ir nebuvo atsižvelgta į ID3 kadrą failo pradžioje. Todėl ID3 kadras būtų perrašytas be paleidimo kodo fLaC, kuris neįrašo failo.
Sprendimas
Norėdami išvengti šios problemos būsimuose FLAC muzikos failuose, įdiekite 2021 m. gegužės 25 d. – KB5003214 (OS komponavimo versijos 19041.1013, 19042.1013 ir 19043.1013) Preview.
Norėdami atkurti paveiktus FLAC muzikos failus, vykdykite šį "PowerShell" scenarijų.
Svarbu: Šis scenarijus neatkurs prarastų metaduomenų, saugomų ID3 rėmelyje. Tačiau dėl to failas vėl bus leistinas.
-
Atidarykite Užrašinė.
-
Nukopijuokite ir įklijuokite šį scenarijų į užrašinę:
# Copyright 2021 Microsoft
# Šis scenarijus pataisys FLAC failą, kurį "Media Foundation" sugadins pagal KB5003430.
# Daugiau informacijos žr. KB5003430
param(
[parametras(Privalomas=$true,
HelpMessage="Kelias į FLAC failą, kuris buvo sugadintas "Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [Eilutė]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Eilutė]$File
)
# Turime sukurti atsarginę dabartinio failo kopiją uždengę klaidas
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Eilutė]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC Repair Tool" ("Microsoft FLAC" atkūrimo įrankis). Šis įrankis pataisys FLAC garso failą, kuris buvo sugadintas redaguojant jo išsamią informaciją."
Write-Output "Affected File: $FullPath"
Write-Output "Bus padaryta failo atsarginė kopija: $BackupLocation"
Write-Output "Ar norite tęsti?"
$choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Taip', '&Ne'), 1)
funkcija ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType juostos 0x7F
jei ($blockType -ne 0)
{
grįžti $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
jei ($blockSize -lt 34)
{
grįžti $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
jei ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)
{
grįžti $false
}
$minFrameSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$maxFrameSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleInfo = (($stream. ReadByte() -shl 24) -bor ($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleRate = $sampleInfo -shr 12
$channelCount = (($sampleInfo -shr 9) -band 0x7) + 1
$bitsPerSample = (($sampleInfo -shr 4) -band 0x1F) + 1
[UInt64]$sampleCount = (($stream. ReadByte() -shl 24) -bor ($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
$sampleCount = (([UInt64]$sampleInfo -band 0xF) -shl 32) -bor $sampleCount
$MD 5HashBytes = New-Object baitas[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
jei ($sampleRate -eq 0)
{
grįžti $false
}
# Šių patikrų perdavimas reiškia, kad tikriausiai turime srauto informacijos antraštę ir galime atkurti failą
Write-Output "Failo srauto informacija"
Write-Output "Sample Rate: $sampleRate"
Write-Output "Garso kanalai: $channelCount"
Write-Output "Sample Depth: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
grįžti $true
}
jei ($choice -eq 0)
{
Copy-Item $FullPath -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]::Begin)
o ($stream. ReadByte() -eq 0) {}
# Dabar reikia išsiaiškinti, kur prasideda galiojantis FLAC metaduomenų rėmelis
# Tikėtina, kad pereisime prie paskutinio dydžio nario baito, kad ieškosime 4 baitų ir bandykite dar kartą
$flacDataStartPosition = $stream. Pozicija – 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
o (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Pradžios kodo įterpimas
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
jei (Test-Path "$FullPath.tmp")
{
Remove-Item "$FullPath.tmp"
}
$fixedStream = [System.IO.File]::Open("$FullPath.tmp", [System.IO.FileMode]::CreateNew)
[byte[]]$startCode = [char[]]('f', 'L', 'a', 'C');
$fixedStream.Write($startCode, 0, $startCode.Length)
$stream. CopyTo($fixedStream)
$stream. Uždaryti()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
Meniu Failas spustelėkite Įrašyti.
-
Dialogo lange Įrašyti kaip raskite aplanką, kuriame norite įrašyti "PowerShell" scenarijų.
-
Lauke Failo vardas įveskiteFixFlacFiles.ps1, pakeiskite lauką Įrašyti kaip tipą į Teksto dokumentai (*.txt), tada spustelėkite Įrašyti.
-
"Windows Explorer" raskite įrašytą "PowerShell" scenarijų.
-
Dešiniuoju pelės mygtuku spustelėkite scenarijų, tada spustelėkite Vykdyti naudojant "PowerShell".
-
Kai būsite paraginti, įveskite nepakartojamo FLAC failo vardą ir paspauskite "Enter".