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

Zusammenfassung

Dieses Update behebt ein Problem mit der Metadatencodierung, das dazu führt, dass FLAC-Musikdateien (Free Lossless Audio Codec) nicht mehr abgespielt werden können, wenn 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-Frame enthält Metadaten wie Titel und Interpret. Der FLAC-Eigenschaftshandler hat angenommen, dass alle FLAC-Dateien mit dem 4-Byte-Startcode fLaC gestartet wurden und den ID3-Frame am Anfang der Datei nicht berücksichtigt haben. Daher würde der ID3-Frame überschrieben, ohne dass der Startcode-fLaC die Datei nicht wiedergabefähig macht.

Fehlerbehebung

Um dieses Problem bei zukünftigen FLAC-Musikdateien zu vermeiden, installieren Sie Preview vom 25. Mai 2021 – KB5003214 (BS-Builds 19041.1013, 19042.1013 und 19043.1013).

Um betroffene FLAC-Musikdateien zu reparieren, führen Sie das folgende PowerShell-Skript aus.

Wichtig: Mit diesem Skript werden die verlorenen Metadaten, die im ID3-Frame gespeichert wurden, nicht wiederhergestellt. Die Datei kann jedoch wieder abspielbar 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.

    Parameter(

    [parameter(mandatory=$true,

    HelpMessage="Der Pfad zu der 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, wenn Fehler auftreten.

    $FileDirectory = Split-Path -Resolve-$File

    $Filename = Split-Path -Leaf -Resolve-$File

    $FullPath = Join-Path -Resolve-$FileDirectory $Filename

    $Filename = [Zeichenfolge]::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 "Eine Sicherung der Datei wird erstellt: $BackupLocation"

    Write-Output "Möchten Sie den Fortsetzen fortsetzen?"

    $choice=$host.ui.PromptForChoice("FlaC Script", "Do you wish to continue", ('&Yes', '&No'), 1)

    -Funktion ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)

    {

    $blockType = $stream. ReadByte()

    $lastBlock = ($blockType -shr 7) -ne 0

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    Rückgabe $false

    }

    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())

    if ($blockSize -lt 34)

    {

    Rückgabe $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)

    {

    Rückgabe $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)

    {

    Rückgabe $false

    }

    # Das Übergeben dieser Prüfungen bedeutet, dass wir wahrscheinlich über einen Datenstrominformationsheader verfügen und die Datei neu erstellen können.

    Write-Output "Dateidatenstrominformationen"

    Write-Output "Beispielrate: $sampleRate"

    Write-Output "Audiokanäle: $channelCount"

    Write-Output "Beispieltiefe: $bitsPerSample"

    Write-Output "MD5-Audiobeispielhash: $MD 5Hash"

    Rückgabe $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)

    while ($stream. ReadByte() -eq 0) {}

    # Wir müssen nun herausfinden, wo ein gültiger FLAC-Metadatenframe beginnt.

    # Wir verweisen wahrscheinlich auf das letzte Byte des Size-Members, also werden 4 Bytes gesucht und es erneut versuchen.

    $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 (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. Close()

    $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 Dateityp in Textdokumente (*.txt), und klicken Sie dann auf Speichern.

  6. Suchen Windows im Explorer nach dem gespeicherten 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 wiederzugebende FLAC-Datei ein, und drücken Sie dann die EINGABETASTE.

Benötigen Sie weitere Hilfe?

Ihre Office-Fähigkeiten erweitern
Schulungen erkunden
Neue Funktionen als Erster erhalten
Microsoft Insider beitreten

War diese Information hilfreich?

Vielen Dank für Ihr Feedback!

Vielen Dank für Ihr Feedback. Es klingt, als ob es hilfreich sein könnte, Sie mit einem unserer Office-Supportmitarbeiter zu verbinden.

×