Zusammenfassung
Dieses Update behebt ein Problem mit der Metadatencodierung, das dazu führt, dass FLAC-Musikdateien (Free Lossless Audio Codec) nicht wiedergegeben werden können, wenn ihr Titel, Interpret oder andere Metadaten geändert werden.
Ursache
Dieses Problem kann auftreten, wenn die FLAC-Dateien einen ID3-Frame vor dem FLAC-Header enthalten. Der ID3-Rahmen enthält Metadaten wie Titel und Künstler. Der FLAC-Eigenschaftshandler ging davon aus, dass alle FLAC-Dateien mit dem 4-Byte-Startcode fLaC beginnen und den ID3-Frame am Anfang der Datei nicht berücksichtigen. Daher würde der ID3-Frame überschrieben, ohne dass der Startcode fLaC die Datei abspielbar macht.
Lösung
Um dieses Problem für zukünftige FLAC-Musikdateien zu verhindern, installieren Sie die Vorschau vom 25. Mai 2021 KB5003214 (Betriebssystembuilds 19041.1013, 19042.1013 und 19043.1013).
Führen Sie das folgende PowerShell-Skript aus, um betroffene FLAC-Musikdateien zu reparieren.
Wichtig
Dieses Skript stellt die verlorenen Metadaten, die im ID3-Frame gespeichert waren, nicht wieder her. Allerdings wird die Datei dadurch wieder spielbar.
Öffnen Sie Microsoft Editor.
Kopieren Sie das folgende Skript, und fügen Sie es in den Editor ein:
# Copyright 2021 Microsoft
# Dieses Skript repariert eine FLAC-Datei, die von Media Foundation in Bezug auf KB5003430 beschädigt wurde.
# Weitere Informationen finden Sie unter KB5003430
param(
[parameter(Mandatory=$true,
HelpMessage="Der Pfad zur FLAC-Datei, die von der Media Foundation beschädigt wurde",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [string]::IsNullOrEmpty($_) -and (Testpfad $_) })]
[Zeichenfolge]$File
)
# Wir müssen die aktuelle Datei sichern, falls Fehler auftreten
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -leaf -resolve $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC-Reparaturtool. Dieses Tool repariert eine FLAC-Audiodatei, die beim Bearbeiten ihrer Details beschädigt wurde."
Write-Output "Betroffene Datei: $FullPath"
Write-Output "Eine Sicherungskopie der Datei wird erstellt: $BackupLocation"
Write-Output "Möchten Sie fortfahren?"
$choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you want to continue", ('&Yes', '&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)
{
return $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
return $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)
{
return $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)
{
return $false
}
# Wenn diese Prüfungen bestanden werden, haben wir wahrscheinlich einen Stream-Info-Header und können die Datei neu erstellen
Write-Output "Datei Stream Informationen"
Write-Output "Sample Rate: $sampleRate"
Write-Output "Audiokanäle: $channelCount"
Write-Output "Abtasttiefe: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
return $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)
Während ($stream. ReadByte() -eq 0) {}
# Wir müssen nun herausfinden, wo ein gültiger FLAC-Metadatenrahmen beginnt
# Wir zeigen wahrscheinlich auf das letzte Byte des Größenmitglieds, also suchen wir 4 Bytes zurück und versuchen es erneut
$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)
}
# Einfügen des Startcodes
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (Testpfad "$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. Schließen()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}Klicken Sie im Menü Datei auf Speichern.
Suchen Sie im Dialogfeld Speichern unter den Ordner, in dem Sie das PowerShell-Skript speichern möchten.
Geben Sie im Feld DateinameFixFlacFiles.ps1ein, ändern Sie das Feld Dateitypin Textdokumente (*.txt), und klicken Sie dann auf Speichern.
Suchen Sie im Windows-Explorer das gespeicherte PowerShell-Skript.
Klicken Sie mit der rechten Maustaste auf das Skript, und klicken Sie dann auf Mit PowerShell ausführen.
Wenn Sie dazu aufgefordert werden, geben Sie den Dateinamen der nicht wiederspielbaren FLAC-Datei ein, und drücken Sie dann die EINGABETASTE.