KB5003430: FLAC-kodad musikfil skadas när metadata redigeras i Utforskaren

Gäller 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

Sammanfattning

Den här uppdateringen åtgärdar ett metadatakodningsproblem som gör att FLAC-musikfiler (Free Lossless Audio Codec) inte går att spela upp om deras titel, artist eller andra metadata ändras.

Orsak

Det här problemet kan uppstå när FLAC-filerna innehåller en ID3-ram före FLAC-huvudet. ID3-ramen innehåller metadata som titel och artist. FLAC-egenskapshanteraren antog att alla FLAC-filer startade med startkoden på 4 byte fLaC och tog inte hänsyn till ID3-ramen i början av filen. Därför skulle ID3-ramen skrivas över utan att startkoden fLaC gjorde filen ospelbar.

Lösning

För att förhindra det här problemet för framtida FLAC-musikfiler installerar du förhandsversionen från 25 maj 2021 – KB5003214 (OS-versioner 19041.1013, 19042.1013 och 19043.1013).

Kör följande PowerShell-skript för att reparera berörda FLAC-musikfiler.

Viktigt!

Skriptet återställer inte förlorade metadata som lagrades i ID3-ramen. Det gör dock att filen kan spelas upp igen.

  1. Öppna Anteckningar.

  2. Kopiera och klistra in följande skript i Anteckningar:

    # Copyright 2021 Microsoft
    # Detta skript kommer att reparera en FLAC-fil som har skadats av Media Foundation med hänvisning till KB5003430.
    # Mer information finns i KB5003430
    param(
    [parameter(Obligatoriskt=$true,
    HelpMessage="Sökvägen till FLAC-filen som har skadats av Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Sträng]$File
    )
    # Vi måste säkerhetskopiera den aktuella filen ifall vi har några fel
    $FileDirectory = Split-Path -Lös $File
    $Filename = Split-Path -leaf -resolve $File
    $FullPath = Join-Path -Lös $FileDirectory $Filename
    $Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_",{1} [DateTime]::Now, $Filename)
    $BackupLocation = Join-Path $FileDirectory $Filename
    Write-Output "Microsoft FLAC Repair Tool. Det här verktyget kommer att reparera en FLAC-ljudfil som skadades när dess detaljer redigerades."
    Write-Output "Berörd fil: $FullPath"
    Write-Output "En säkerhetskopia av filen kommer att göras: $BackupLocation"
    Write-Output "Vill du fortsätta?"
    $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
    om ($blockType -ne 0)
    {
    Returnera $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    om ($blockSize -lt 34)
    {
    Returnera $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    om ($minAudioBlockSize -lt 16 -eller $maxAudioBlockSize -lt 16)
    {
    Returnera $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)
    {
    Returnera $false
    }
    # Om vi klarar dessa kontroller innebär det att vi troligen har ett informationshuvud för dataströmmen och kan återskapa filen
    Write-Output "Arkiv Stream information"
    Write-Output "Samplingsfrekvens: $sampleRate"
    Write-Output "Ljudkanaler: $channelCount"
    Write-Output "Provdjup: $bitsPerSample"
    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
    Returnera $true
    }
    Om ($choice -ekv 0)
    {
    Copy-Item $FullPath -Destination $BackupLocation -Force
    $stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
    $stream. Seek(4, [System.IO.SeekOrigin]::Begin)
    medan ($stream. ReadByte() -eq 0) {}
    # Vi måste nu ta reda på var en giltig FLAC-metadataram börjar
    # Vi pekar troligen på den sista byten i storleksmedlemmen så vi söker tillbaka 4 byte och försöker igen
    $flacDataStartPosition = $stream. Placering – 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Infoga startkoden
    $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 = [tecken[]]('f', 'L', 'a', 'C');
    $fixedStream.Write($startCode, 0, $startCode.Length)
    $stream. CopyTo($fixedStream)
    $stream. Close()
    $fixedStream.Stäng()
    Move-Item -Force "$FullPath.tmp" $FullPath
    }
  3. Klicka på Spara på Arkiv-menyn.

  4. Leta reda på den mapp där du vill spara PowerShell-skriptet i dialogrutan Spara som .

  5. I rutan Filnamn skriver du FixFlacFiles.ps1ändrar rutan Filformat till Textdokument (*.txt) och klickar sedan på Spara.

  6. Leta reda på PowerShell-skriptet som du sparade i Utforskaren.

  7. Högerklicka på skriptet och klicka sedan på Kör med PowerShell.

  8. När du uppmanas till det skriver du in filnamnet för den ospelbara FLAC-filen och trycker sedan på Retur.