Sažetak
Ovo ažuriranje rješava problem šifriranja metapodataka koji uzrokuje nemogućnost reprodukcije glazbenih datoteka Free Lossless Audio Codec (FLAC) ako se promijeni njihov naslov, izvođač ili drugi metapodaci.
Uzrok
Taj se problem može pojaviti kada FLAC datoteke sadrže okvir ID3 prije zaglavlja FLAC. Okvir ID3 sadrži metapodatke kao što su naslov i izvođač. Rukovatelj svojstava FLAC pretpostavlja da sve FLAC datoteke počinju s 4-bajtnim početnim kodom fLaC i ne uzima u obzir okvir ID3 na početku datoteke. Stoga bi okvir ID3 bio prebrisan bez početnog koda fLaC, što bi datoteku učinilo nemogućom za reprodukciju.
Rješenje
Da biste spriječili taj problem za buduće FLAC glazbene datoteke, instalirajte pretpregled od 25. svibnja 2021. – KB5003214. (međuverzije OS-a 19041.1013, 19042.1013 i 19043.1013).
Da biste popravili zahvaćene FLAC glazbene datoteke, pokrenite sljedeću skriptu komponente PowerShell.
Važno
Ova skripta neće vratiti izgubljene metapodatke koji su bili pohranjeni u okviru ID3. No zbog toga je datoteka opet moguće reproducirati.
Otvaranje bloka za pisanje.
Kopirajte i zalijepite sljedeću skriptu u blok za pisanje:
# Autorska prava 2021 Microsoft
# Ova skripta će popraviti FLAC datoteku koju je Media Foundation oštetio u vezi s KB5003430.
# Dodatne informacije potražite u članku KB5003430
param(
[parameter(Obavezno=$true,
HelpMessage="Put do FLAC datoteke koju je oštetio Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Niz]$File
)
# Moramo sigurnosno kopirati trenutnu datoteku u slučaju da postoje pogreške
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoftov alat za popravak FLAC. Ovaj alat će popraviti FLAC audiodatoteku koja je oštećena prilikom uređivanja njezinih detalja."
Write-Output "Zahvaćena datoteka: $FullPath"
Write-Output "Izradit će se sigurnosna kopija datoteke: $BackupLocation"
Write-Output "Želite li nastaviti?"
$choice=$host.ui.PromptForChoice("Popravljanje FLAC skripte", "Želite li nastaviti", ('&Da', '&Ne'), 1)
funkcija ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
Povrat $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
Povrat $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)
{
Povrat $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 bajt[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
IF ($sampleRate -EQ 0)
{
Povrat $false
}
# Ako prođete ove provjere, vjerojatno imamo zaglavlje informacija o strujanju i možemo ponovno izgraditi datoteku
Write-Output "Podaci o Stream datoteke"
Write-Output "Stopa uzorkovanja: $sampleRate"
Write-Output "Audiokanali: $channelCount"
Write-Output "Dubina uzorka: $bitsPerSample"
Write-Output "MD5 Audio sample Hash: $MD 5Hash"
Povrat $true
}
IF ($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)
while ($stream. ReadByte() -eq 0) {}
# Sada moramo shvatiti odakle počinje valjani FLAC okvir metapodataka
# Vjerojatno pokazujemo na zadnji bajt člana veličine pa ćemo potražiti natrag 4 bajta i pokušati ponovno
$flacDataStartPosition = $stream. Položaj - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Umetanje početne šifre
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (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. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}Na izborniku Datoteka kliknite Spremi.
U dijaloškom okviru Spremanje u obliku pronađite mapu u koju želite spremiti skriptu komponente PowerShell.
U okvir Naziv datoteke upišite FixFlacFiles.ps1, promijenite okvir Spremi u obliku u Tekstni dokumenti (*.txt), a zatim kliknite Spremi.
U programu Windows Explorer pronađite spremljenu skriptu komponente PowerShell.
Desnom tipkom miša kliknite skriptu, a zatim kliknite Pokreni pomoću komponente PowerShell.
Kada se to od vas zatraži, upišite naziv datoteke FLAC datoteke koja se ne može reproducirati, a zatim pritisnite Enter.