Rezumat
Această actualizare tratează o problemă de codificare a metadatelor care face ca fișierele de muzică Free Lossless Audio Codec (FLAC) să devină imposibil de redat dacă titlul, artistul sau alte metadate se modifică.
Cauza
Această problemă poate apărea atunci când fișierele FLAC conțin un cadru ID3 înaintea antetului FLAC. Cadrul ID3 conține metadate, cum ar fi titlul și artistul. Rutina de tratare a proprietăților FLAC a presupus că toate fișierele FLAC începeau cu codul de pornire de 4 byți fLaC și nu luau în considerare cadrul ID3 de la începutul fișierului. Prin urmare, cadrul ID3 ar fi suprascris fără ca fLaC să facă fișierul imposibil de redat.
Rezolvarea
Pentru a preveni această problemă pentru fișierele de muzică FLAC viitoare, instalați Previzualizarea din 25 mai 2021 - KB5003214 (versiunile sistemului de operare 19041.1013, 19042.1013 și 19043.1013).
Pentru a repara fișierele de muzică FLAC afectate, rulați următorul script PowerShell.
Important
Acest script nu va restaura metadatele pierdute care au fost stocate în cadrul ID3. Totuși, acest lucru face fișierul să poată fi redat din nou.
Deschideți Notepad.
Copiați și lipiți următorul script în Notepad:
# Drepturi de autor 2021 Microsoft
# Acest script va repara un fișier FLAC care a fost deteriorat de Media Foundation cu referire la KB5003430.
# Pentru mai multe informații, consultați KB5003430
param(
[parameter(Obligatoriu=$true,
HelpMessage="Calea către fișierul FLAC care a fost deteriorat de Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[șir]$File
)
# Trebuie să facem backup fișierului curent în caz că avem erori
$FileDirectory = Split-Path -Rezolvare $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Rezolvare $FileDirectory $Filename
$Filename = [șir]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Instrumentul de reparare Microsoft FLAC. Acest instrument va repara un fișier audio FLAC care a fost deteriorat la editarea detaliilor acestuia."
Write-Output "Fișier afectat: $FullPath"
Write-Output "Se va face o copie de rezervă a fișierului: $BackupLocation"
Write-Output "Continuați?"
$choice=$host.ui.PromptForChoice("Remedierea scriptului FLAC", "Continuați", ('&Da', '&Nu'), 1)
funcția ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
IF ($blockType -ne 0)
{
Returnați $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
IF ($blockSize -lt 34)
{
Returnați $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)
{
Returnați $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)
{
Returnați $false
}
# Trecerea acestor verificări înseamnă că probabil avem un antet de informații despre flux și putem reconstrui fișierul
Write-Output "Informații Stream fișier"
Write-Output "Rata de eșantionare: $sampleRate"
Write-Output "Canale audio: $channelCount"
Write-Output "Adâncimea eșantionului: $bitsPerSample"
Write-Output "MD5 Audio sample hash: $MD 5Hash"
Returnați $true
}
IF ($choice -EQ 0)
{
Copy-Item $FullPath -Destinație $BackupLocation -Forță
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]::Begin)
în timp ce ($stream. ReadByte() -eq 0) {}
# Acum trebuie să ne dăm seama unde începe un cadru de metadate FLAC valid
# Probabil că indicăm ultimul byte al membrului de dimensiune, așa că vom căuta 4 byți înapoi și vom reîncerca
$flacDataStartPosition = $stream. Poziție - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Inserarea codului de pornire
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (cale de test "$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.Lungime)
$stream. CopyTo($fixedStream)
$stream. Închidere()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}În meniul Fișier , faceți clic pe Salvare.
În caseta de dialog Salvare ca , găsiți folderul în care doriți să salvați scriptul PowerShell.
În caseta Nume fișier , tastați FixFlacFiles.ps1, modificați caseta Tip fișier laDocumente text (*.txt), apoi faceți clic pe Salvare.
În Windows Explorer, găsiți scriptul PowerShell pe care l-ați salvat.
Faceți clic dreapta pe script, apoi faceți clic pe Rulare cu PowerShell.
Atunci când vi se solicită, tastați numele fișierului FLAC care nu se poate reda și apăsați pe Enter.