KB5003430: FLAC-codierte Musikdatei ist beschädigt, wenn Metadaten in Windows Explorer

Gilt für
Windows 10 Enterprise, version 2004 Windows 10 Home and Pro, version 2004 Windows 10 Pro, version 2004 Windows 10 Enterprise and Education, version 2004 Windows 10 Pro Education, version 2004 Windows 10 Pro for Workstations, version 2004 Windows 10 Pro, version 20H2 Windows 10 Enterprise, version 20H2 Windows 10 Enterprise and Education, version 20H2 Windows 10 Home and Pro, version 20H2 Windows 10 Pro Education, version 20H2 Windows 10 Pro for Workstations, version 20H2

Zusammenfassung

Dieses Update behebt ein Metadatencodierungsproblem, das dazu führt, dass FLAC-Musikdateien (Free Lossless Audio Codec) nicht wiedergegeben werden können, wenn ihr Titel, Ihr 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-Frame enthält Metadaten wie Titel und Künstler. Der FLAC-Eigenschaftenhandler ging davon aus, dass alle FLAC-Dateien mit dem 4-Byte-Startcode fLaC gestartet wurden und den ID3-Frame am Anfang der Datei nicht berücksichtigten. Daher würde der ID3-Frame überschrieben werden, ohne dass der Startcode fLaC die Datei nicht wiedergeben kann.

Lösung

Um dieses Problem für zukünftige FLAC-Musikdateien zu vermeiden, installieren Sie die Vorschauversion vom 25. Mai 2021 – KB5003214 (BS-Builds 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 wurden, nicht wieder her. Dadurch kann die Datei jedoch wieder wiedergegeben werden.

  1. Öffnen Sie Microsoft Editor.

  2. Kopieren Sie das folgende Skript, und fügen Sie es in 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 Media Foundation beschädigt wurde",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [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 Repair Tool. Dieses Tool repariert eine FLAC-Audiodatei, die beim Bearbeiten der Details beschädigt wurde."
    Write-Output "Betroffene Datei: $FullPath"
    Write-Output "Es wird eine Sicherung der Datei erstellt: $BackupLocation"
    Write-Output "Möchten Sie den Vorgang fortsetzen?"
    $choice=$host.ui.PromptForChoice("Fix flac script", "Do you wish 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)
    {
    $false zurückgeben
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    $false zurückgeben
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    if ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)
    {
    $false zurückgeben
    }
    $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)
    {
    $false zurückgeben
    }
    Das Bestehen dieser Überprüfungen bedeutet, dass wir wahrscheinlich über einen Datenstrominformationsheader verfügen und die Datei neu erstellen können.
    Write-Output "Datei Stream Information"
    Write-Output "Sample Rate: $sampleRate"
    Write-Output "Audiokanäle: $channelCount"
    Write-Output "Sample Depth: $bitsPerSample" (Beispieltiefe: $bitsPerSample)
    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
    $true zurückgeben
    }
    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)
    while ($stream. ReadByte() -eq 0) {}
    # Wir müssen jetzt herausfinden, wo ein gültiger FLAC-Metadatenframe beginnt.
    # Wir zeigen wahrscheinlich auf das letzte Byte des Größenelements, sodass wir 4 Bytes zurücksuchen 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)
    }
    # Fügen Sie den Startcode ein.
    $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. Close()
    $fixedStream.Close()
    Move-Item $FullPath "$FullPath.tmp" erzwingen
    }
  3. Klicken Sie im Menü Datei auf Speichern.

  4. Suchen Sie im Dialogfeld Speichern unter den Ordner, in dem Sie das PowerShell-Skript speichern möchten.

  5. Geben Sie im Feld DateinameFixFlacFiles.ps1ein, ändern Sie das Feld Dateityp in Textdokumente (*.txt), und klicken Sie dann auf Speichern.

  6. Suchen Sie in Windows Explorer nach dem PowerShell-Skript, das Sie gespeichert haben.

  7. Klicken Sie mit der rechten Maustaste auf das Skript, und klicken Sie dann auf Mit PowerShell ausführen.

  8. Wenn Sie dazu aufgefordert werden, geben Sie den Dateinamen der nicht wiedergegebenen FLAC-Datei ein, und drücken Sie dann die EINGABETASTE.