Windows 10 FLAC-kodierte Musikdateien können durch Bearbeitung zerstört werden [Workaround]

Microsoft hat einen Artikel mit einem Workaround herausgegeben, der einen Fehler beschreibt, dass FLAC-kodierte Dateien bei der Bearbeitung der Metadaten im Windows Explorer zerstört werden können. Falls es schon aufgetreten ist, hat man auch gleich ein Script beigelegt.

Um diesen Fehler vorzubeugen, empfiehlt Microsoft die KB5003214 zu installieren. Dieser Workaround ist für die Windows 10 2004, Windows 10 20H2 und Windows 10 21H1

„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-Property-Handler ging davon aus, dass alle FLAC-Dateien mit dem 4-Byte-Startcode fLaC beginnen und berücksichtigte den ID3-Frame am Anfang der Datei nicht. Daher würde der ID3-Frame ohne den Startcode fLaC überschrieben werden, wodurch die Datei nicht abspielbar wäre.“

Ich hab euch das Script einmal schon abgespeichert, sodass ihr es nur noch herunterladen und ausführen müsst.

Manueller Workaround:

  • Notepad (Editor) öffnen und diesen Inhalt hineinkopieren:

Info aufklappen

# Copyright 2021 Microsoft

# This script will repair a FLAC file that has been corrupted by Media Foundation in reference to KB5003430.

# Refer to KB5003430 for further information

param(

[parameter(Mandatory=$true,

HelpMessage="The path to the FLAC file that has been corrupted by Media Foundation",

ValueFromRemainingArguments=$true)]

[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]

[String]$File

)

# We need to back up the current file incase we have any errors

$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. This tool will repair a FLAC audio file that was corrupted when editing its details."

Write-Output "Affected File: $FullPath"

Write-Output "A backup of the file will be made: $BackupLocation"

Write-Output "Do you wish to continue?"

$choice=$host.ui.PromptForChoice("Fixing 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)

{

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

$MD5HashBytes = New-Object byte[] 16

$stream.Read($MD5HashBytes, 0, $MD5HashBytes.Length)

$MD5Hash = [Guid]($MD5HashBytes)

if ($sampleRate -eq 0)

{

return $false

}

# Passing these checks means that we likely have a stream info header and can rebuild the file

Write-Output "File Stream Information"

Write-Output "Sample Rate: $sampleRate"

Write-Output "Audio Channels: $channelCount"

Write-Output "Sample Depth: $bitsPerSample"

Write-Output "MD5 Audio Sample Hash: $MD5Hash"

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)

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

# We now need to figure out where a valid FLAC metadata frame begins

# We are likely pointing to the last byte of the size member so we'll seek back 4 bytes and retry

$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)

}

# Insert the start code

$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

}

  • Im Menü Datei -> Speichern unter den Dateinamen FixFlacFiles.ps1 eingeben und speichern
  • Rechtsklick auf das Skript und „Mit PowerShell ausführen“
  • Jetzt wird man aufgefordert, den Dateinamen der nicht abspielbaren FLAC-Datei einzugeben und drückt dann Enter.

Windows 10 Tutorials und Hilfe

In unserem Windows 10 Wiki findet ihr sehr viele hilfreiche Tipps und Tricks. Falls ihr Fragen habt, dann stellt diese ganz einfach bei uns im Forum.

Windows 10 FLAC-kodierte Musikdateien können durch Bearbeitung zerstört werden [Workaround]
weitere Artikel zu diesem Thema
zu den aktuellen News

Ein Kommentar zu “Windows 10 FLAC-kodierte Musikdateien können durch Bearbeitung zerstört werden [Workaround]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Hiermit akzeptiere ich die Datenschutzerklärung für diesen Kommentar.