Rezumat
Această actualizare se adresează unei probleme de codificare a metadatelor, care determină ca fișierele de muzică FREE Lossless Audio Codec (FLAC) să devină iluzabile dacă denumirea, artistul sau alte metadate ale acestora se modifică.
Cauză
Această problemă poate apărea atunci când fișierele FLAC conțin un cadru ID3 înainte de antetul FLAC. Cadrul ID3 conține metadate, cum ar fi titlul și artistul. Gestionarul de proprietăți FLAC presupunea că toate fișierele FLAC au început cu codul de pornire 4 byți fLaC și nu au luat în considerare cadrul ID3 de la începutul fișierului. Prin urmare, cadrul ID3 ar fi suprascris fără codul de pornire fLaC care să redea fișierul iluzabil.
Rezolvare
Pentru a preveni această problemă pentru fișierele de muzică FLAC viitoare, instalați previzualizarea 25 mai 2021 - KB5003214 (compilări OS 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ă se redea din nou.
-
Deschideți Notepad.
-
Copiați și lipiți următorul script în notepad:
# Copyright 2021 Microsoft
# Acest script va repara un fișier FLAC care a fost deteriorat de Media Foundation ca referință la KB5003430.
# Consultați KB5003430 pentru informații suplimentare
param(
[parameter(Mandatory=$true,
HelpMessage="Calea către fișierul FLAC care a fost deteriorat de Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [Șir]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Șir]$File
)
# Trebuie să facem o verificare a fișierului curent, în caz că avem erori
$FileDirectory = Split-Path -Rezolvarea $File
$Filename = Split-Path -Frunză -Rezolvare $File
$FullPath = Join-Path -Rezolvare$ $FileDirectory $Filename
$Filename = [Șir]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DatăOră]::Acum, $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 atunci când editează detaliile sale."
Write-Output "Fișier afectat: $FullPath"
Write-Output se va face o copie backup a fișierului: $BackupLocation"
Write-Output "Continuați?"
$choice=$host.ui.PromptForChoice("Remedierea scriptului FLAC", "Doriți să 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)
{
returnare $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
returnare $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)
{
returnare $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)
{
returnare $false
}
# Trecerea acestor verificări înseamnă că avem probabil un antet de informații în flux și putem să reconstruim fișierul
Write-Output "Informații flux de fișiere"
Write-Output "Rată eșantion: $sampleRate"
Write-Output "Canale audio: $channelCount"
Write-Output "Adâncime eșantion: $bitsPerSample"
Write-Output "Cod hash eșantion audio MD5: $MD 5Hash"
returnare $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)
($stream. ReadByte() -eq 0) {}
# Acum trebuie să ne dăm seama unde începe un cadru de metadate FLAC valid
# Cel mai probabil, suntem pe ultimul byte al membrurii de dimensiune, așa că vom căuta înapoi 4 byți ș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)
}
# Inserați codul 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.Length)
$stream. CopyTo($fixedStream)
$stream. Close()
$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 Salvare cu tipul la Documente 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 Executare cu PowerShell.
-
Atunci când vi se solicită, tastați numele de fișier al fișierului FLAC care se poate reda, apoi apăsați pe Enter.