KB5003430: FLAC-codierte Musikdatei wird beschädigt, wenn Metadaten in Windows Explorer bearbeitet werden

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 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.

  1. Öffnen Sie Microsoft Editor.

  2. 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
    }
  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 Dateitypin Textdokumente (*.txt), und klicken Sie dann auf Speichern.

  6. Suchen Sie im Windows-Explorer das gespeicherte PowerShell-Skript.

  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 wiederspielbaren FLAC-Datei ein, und drücken Sie dann die EINGABETASTE.