Sažetak
Ovo ažuriranje rješava problem kodiranja metapodataka koji uzrokuje da se glazbene datoteke besplatnog audiokodatoteka (FLAC- a) ne mogu igrati ako se promijeni njihov naslov, izvođač ili drugi metapodaci.
Uzrok
Taj se problem može pojaviti kada FLAC datoteke sadrže okvir ID3 ispred zaglavlja FLAC-a. Okvir ID3 sadrži metapodatke kao što su naslov i izvođač. Rukovatelj svojstvom FLAC pretpostavio je da su sve FLAC datoteke počele s početnim kodom od 4 bajta fLaC i nisu uzimale u obzir okvir ID3 na početku datoteke. Stoga bi se okvir ID3 prebrisao bez prikaza fLaC koda za pokretanje datoteke koja se ne može prikazati.
Rješenje
Da biste spriječili taj problem za buduće glazbene datoteke sustava FLAC, instalirajte 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: Skripta neće vratiti izgubljene metapodatke pohranjene u okviru ID3. No datoteka se ponovno može reproducirati.
-
Otvorite Blok za pisanje.
-
Kopirajte i zalijepite sljedeću skriptu u blok za pisanje:
# Copyright 2021 Microsoft
# Ova skripta popravit će FLAC datoteku koju je media Foundation oštetio u odnosu na 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 napraviti back-up trenutnu datoteku u kazu da imamo bilo kakve pogreške
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -List -Resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Niz]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC Repair Tool. Alat će popraviti FLAC audiodatoteke oštećene prilikom uređivanja detalja."
Write-Output "Zahvaćena datoteka: $FullPath"
Write-Output "Stvorit će se sigurnosna kopija datoteke: $BackupLocation"
Write-Output "Želite li nastaviti?"
$choice=$host.ui.PromptForChoice("Popravljanje SKRIPTE ZA FLAC", "Ž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)
{
return $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
return $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)
{
return $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 byte[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
return $false
}
# Prenošenje tih provjera znači da vjerojatno imamo zaglavlje podataka o strujanje i možemo ponovno izgraditi datoteku
Write-Output "File Stream Information" (Podaci o strujanje datoteka)
Write-Output "Sample Rate: $sampleRate"
Write-Output "Audio kanali: $channelCount"
Write-Output "Dubina uzorka: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
return $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)
dok ($stream. ReadByte() -eq 0) {}
# Sada moramo otkriti gdje počinje valjani okvir metapodataka za FLAC
# Vjerojatno ćemo upućivate na zadnji bajt člana veličine pa ćemo potražiti 4 bajta i ponovno pokušati
$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)
}
# Insert the start code
$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)
[bajt[]]$startCode = [char[]]('f', 'L', 'a', 'C');
$fixedStream.Write($startCode, 0, $startCode.Length)
$stream. CopyTo($fixedStream)
$stream. Zatvori()
$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 kao vrstu u Tekstni dokumenti (*.txt), a zatim kliknite Spremi.
-
U Windows Explorer pronađite skriptu komponente PowerShell koju ste spremili.
-
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 igrati, a zatim pritisnite Enter.