Shrnutí
Tato aktualizace řeší problém s kódováním metadat, který způsobuje, že hudební soubory free lossless audio codec (FLAC) se nehrají, pokud se změní jejich název, interpret nebo jiná metadata.
Příčina
K tomuto problému může dojít, když soubory FLAC obsahují rámeček ID3 před záhlavím FLAC. Rámeček ID3 obsahuje metadata, jako je název a interpret. Obslužná rutina vlastnosti FLAC předpokládá, že všechny soubory FLAC začaly se 4 byte počátečním kódem fLaC a nezohlední rámec ID3 na začátku souboru. Proto by se rámec ID3 přepsal bez počátečního kódu fLaC, který by soubor přehrál.
Řešení
Abyste tomuto problému zabránili u budoucích hudebních souborů FLAC, nainstalujte si 25. května 2021 – KB5003214 (buildy operačního systému 19041.1013, 19042.1013 a 19043.1013) Preview.
Pokud chcete opravit ovlivněné hudební soubory FLAC, spusťte následující skript PowerShellu.
Důležité informace: Tento skript obnoví ztracená metadata uložená v rámci ID3. Soubor ale bude znovu možné přehrát.
-
Otevřete Poznámkový blok.
-
Zkopírujte a vložte následující skript do poznámkového bloku:
# Copyright 2021 Microsoft
# Tento skript opraví soubor FLAC, který je v odkazu na KB5003430 poškozený společností Media Foundation.
# Další informace najdete v článku KB5003430.
param(
[parameter(Mandatory=$true;
HelpMessage="Cesta k souboru FLAC, který je poškozený pomocí Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# Musíme zálohovat aktuální soubor v případě, že máme nějaké chyby.
$FileDirectory = Split-Path -Vyřešit $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Vyřešit $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [Datum a čas]::Teď, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Nástroj pro opravu Microsoft FLAC. Tento nástroj opraví zvukový soubor FLAC, který byl při úpravách jeho podrobností poškozený."
Write-Output "Ovlivněný soubor: $FullPath"
Write-Output "Bude provedena záloha souboru: $BackupLocation"
Write-Output "Chcete pokračovat?"
$choice=$host.ui.PromptForChoice("Oprava skriptu FLAC", "Chcete pokračovat", ('&Ano', '&Ne'), 1)
funkce ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
vrátit $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
vrátit $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 - nebo $maxAudioBlockSize -lt 16)
{
vrátit $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átit $false
}
# Předání těchto kontrol znamená, že pravděpodobně máme záhlaví s informacemi o datovém proudu a můžeme soubor znovu sestavit.
Write-Output "File Stream Information" (Informace o datovém proudu souborů)
Write-Output "Vzorkovací frekvence: $sampleRate"
Write-Output "Zvukové kanály: $channelCount"
Write-Output "Ukázka hloubky: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
vrátit $true
}
if ($choice -eq 0)
{
Copy-Item $FullPath -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath; [System.IO.FileMode]::Open)
$stream. Hledání(4, [System.IO.SeekOrigin]::Begin)
while ($stream. ReadByte() -eq 0) {}
# Teď musíme zjistit, kde začíná platný rámec metadat FLAC.
# Pravděpodobně nasedáme na poslední bajt člena velikosti, takže vyhledáme 4 bajty a zopakujeme to
$flacDataStartPosition = $stream. Pozice – 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Vložení počátečního kódu
$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. Zavřít()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
V nabídce Soubor klikněte na Uložit.
-
V dialogovém okně Uložit jako vyhledejte složku, do které chcete uložit skript PowerShellu.
-
Do pole Název souboru zadejte FixFlacFiles.ps1, změňte pole Uložit jako typ na Textové dokumenty (*.txt) a potom klikněte na Uložit.
-
V Windows Exploreru najděte skript PowerShellu, který jste uložili.
-
Klikněte pravým tlačítkem myši na skript a potom klikněte na Spustit s PowerShellem.
-
Po zobrazení výzvy zadejte název souboru souboru FLAC, který se nehraje, a stiskněte Enter.