Súhrn
Táto aktualizácia sa týka problému s kódovaním metaúdajov, ktorý spôsobuje, že hudobné súbory Free Lossless Audio Codec (FLAC) sa stanú neprehrateľnými v prípade zmeny ich názvu, interpreta alebo iných metaúdajov.
Príčina
Tento problém sa môže vyskytnúť, keď súbory FLAC obsahujú rám ID3 pred hlavičkou FLAC. Rám ID3 obsahuje metaúdaje, ako napríklad názov a umelec. Obslužný program vlastnosti FLAC predpokladal, že všetky súbory FLAC sa začali kódom začiatku 4 bajtov fLaC a neberú do úvahy rám ID3 na začiatku súboru. Z tohto dôvodu sa rám ID3 prepíše bez prehrateho kódu začiatku, pri vykresľovaní súboru nie je možné prehrať.
Riešenie
Ak chcete zabrániť tomuto problému v budúcich hudobných súboroch FLAC, nainštalujte 25. mája 2021 – KB5003214 (zostavy OS 19041.1013, 19042.1013 a 19043.1013) Preview.
Ak chcete opraviť hudobné súbory FLAC, ktorých sa týka, spustite nasledujúci skript prostredia PowerShell.
Dôležité: Tento skript obnoví stratené metaúdaje, ktoré boli uložené v ráme ID3. Tým sa však súbor znova prehrá.
-
Otvorte program Poznámkový blok.
-
Skopírujte a prilepte nasledujúci skript do poznámkového bloku:
# Autorské práva 2021 Microsoft
# Tento skript opraví súbor FLAC, ktorý je poškodený program Media Foundation, s odkazom na KB5003430.
# Ďalšie informácie nájdete v téme KB5003430
param(
[parameter(Povinné=$true;
HelpMessage="Cesta k súboru FLAC, ktorý je poškodený aplikáciou Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Reťazec]$File
)
# Musíme zálohovať aktuálny súbor pre všetky chyby
$FileDirectory = Split-Path – vyriešiť $File
$Filename = Split-Path -Listové riešenie $File
$FullPath = Join-Path – vyriešiť $FileDirectory $Filename
$Filename = [Reťazec]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DátumAČas]::Teraz, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC Repair Tool. Tento nástroj opraví zvukový súbor FLAC, ktorý bol poškodený pri úprave jeho podrobností.
Write-Output "Ovplyvnený súbor: $FullPath"
Write-Output Sa vytvorí záloha súboru: $BackupLocation.
Write-Output "Chcete pokračovať?"
$choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue" (Chcete pokračovať?), ('&Áno', '&Nie'), 1)
function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
vrátiť $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
vrátiť $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)
{
vrá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 bajt[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
vrátiť $false
}
# Prenesenie týchto kontrol znamená, že pravdepodobne máme hlavičku s informáciami o streame a môžeme opätovne zostaviť súbor
Write-Output Informácie o streame súboru
Write-Output "Vzorová sadzba: $sampleRate"
Write-Output "Zvukové kanály: $channelCount"
Write-Output Ukážková hĺbka: $bitsPerSample
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
vrátiť $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)
zatiaľ čo ($stream. ReadByte() -eq 0) {}
# Teraz musíme zistiť, kde sa začína platný rám metaúdajov FLAC
# Pravdepodobne ukazovame na posledný bajt člena veľkosti, aby sme vrátili 4 bajty a zopakovali pokusy
$flacDataStartPosition = $stream. Position - 4
$stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)
}
# Vloženie kódu začatia
$stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)
if (Testovacia cesta "$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.Dĺžka)
$stream. CopyTo($fixedStream)
$stream. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
V ponuke Súbor kliknite na položku Uložiť.
-
V dialógovom okne Uložiť ako vyhľadajte priečinok, do ktorého chcete uložiť skript prostredia PowerShell.
-
Do poľa Názov súboru zadajte text FixFlacFiles.ps1 , zmeňte pole Uložiť vo formáte na Textové dokumenty (*.txt) a potom kliknite na tlačidlo Uložiť.
-
V Windows Prieskumníkovi vyhľadajte skript prostredia PowerShell, ktorý ste uložili.
-
Kliknite pravým tlačidlom myši na skript a potom kliknite na položku Spustiť pomocou prostredia PowerShell.
-
Po zobrazení výzvy zadajte názov súboru, ktorý nie je možné prehrať, a stlačte kláves Enter.