Összefoglalás
Ez a frissítés egy metaadat-kódolási problémát javít, amelynek következtében a szabad veszteségmentes audiokodekek (FLAC) zenefájlok lejátszhatatlanná válnak, ha címük, előadójuk vagy más metaadataik megváltoznak.
A probléma oka
Ez a probléma akkor fordulhat elő, ha a FLAC-fájlok a FLAC fejléc előtt egy ID3 kerettel ékezetet tartalmaznak. Az ID3-keret metaadatokat, például címet és előadót tartalmaz. A FLAC tulajdonságkezelője azt feltételezte, hogy minden FLAC-fájl a 4 bájtos fLaC kóddal indult el, és nem vette figyelembe az ID3 keretet a fájl elején. Ezért az ID3-keret felülíródik az fLaC indítási kód nélkül, így a fájl nem lesz lejátszható.
Megoldás
A jövőbeli FLAC-zenefájlokra vonatkozó probléma megelőzéséhez telepítse a 2021. május 25. – KB5003214 (az operációs rendszer 19041.1013-as, 19042.1013-as és 19043.1013-as buildjét) –előzetes verzió.
Az érintett FLAC-zenefájlok javításához futtassa az alábbi PowerShell-parancsprogramot.
Fontos: Ez a parancsfájl nem fogja visszaállítani az ID3 keretben tárolt elveszett metaadatokat. A fájl azonban ismét lejátszható lesz.
-
Nyissa meg a Jegyzettömb alkalmazást.
-
Másolja és illessze be az alábbi parancsfájlt a jegyzettömbbe:
# Copyright 2021 Microsoft
# Ez a parancsprogram kijavítja a MEDIA Foundation által a KB5003430-re való hivatkozással sérült FLAC-fájlt.
# További információért lásd: KB5003430
paraméter(
[parameter(Mandatory=$true;
HelpMessage="A Media Foundation által sérült FLAC-fájl elérési útja"
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Karakterlánc]$File
)
# Biztonsági mentése az aktuális fájlról a hibák miatt
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -Levél -Feloldása $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [Karakterlánc]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC javítóeszköz. Ez az eszköz kijavítja a FLAC hangfájlt, amely a részletek szerkesztésekor sérült."
Write-Output "Érintett fájl: $FullPath"
Write-Output "A fájlról biztonsági másolat készül: $BackupLocation"
Write-Output a "Szeretné folytatni?" kérdést.
$choice=$host.ui.PromptForChoice("A FLAC-parancsprogram rögzítése", "Kíván folytatni", ('&Igen', '&No'), 1)
function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
vissza $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
vissza $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -vagy $maxAudioBlockSize -lt 16)
{
vissza $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)
{
vissza $false
}
# Ezeknek az ellenőrzéseknek az átadása azt jelenti, hogy valószínűleg van egy adatfolyam-adatfejléc, és újraépíthetjük a fájlt
Write-Output "Fájladatfolyam-információk"
Write-Output "Mintadíj: $sampleRate"
Write-Output "Hangcsatornák: $channelCount"
Write-Output "Mintamélység: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash" (MD5 hangminta kivonat): $MD 5Hash"
vissza $true
}
if ($choice -eq 0)
{
Copy-Item $FullPath -Destination $BackupLocation -Force
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Keresés(4; [System.IO.SeekOrigin]::Begin)
($stream. ReadByte() -eq 0) {}
# Most ki kell derítenünk, hol kezdődik egy érvényes FLAC metaadatkeret
# Valószínűleg a méret tag utolsó bájtjára mutatunk, ezért vissza fogunk keresni 4 bájtot, és újra próbálkozunk
$flacDataStartPosition = $stream. Pozíció – 4
$stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)
}
# A start kód beszúrása
$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)
[bájt[]]$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
}
-
Kattintson a Fájl menü Mentés parancsára.
-
A Mentés másként párbeszédpanelen keresse meg azt a mappát, amelybe menteni szeretné a PowerShell-parancsprogramot.
-
A Fájlnév mezőbe írja be a FixFlacFiles.ps1szöveget, a Fájltípus mezőben módosítsa a Szövegdokumentumok (*.txt) szöveget, majd kattintson a Mentés gombra.
-
A Windows Explorerben keresse meg a mentett PowerShell-parancsprogramot.
-
Kattintson a jobb gombbal a parancsfájlra, és válassza a Futtatás PowerShell használatával parancsot.
-
Amikor a rendszer kéri, írja be a nem lejátszható FLAC-fájl nevét, majd nyomja le az Enter billentyűt.