KB5003430: FLAC-gecodeerd muziekbestand is beschadigd wanneer metagegevens worden bewerkt in Windows Verkenner

Van toepassing op
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

Samenvatting

Deze update verhelpt een probleem met de codering van metagegevens dat ertoe leidde dat FLAC-muziekbestanden (Free Lossless Audio Codec) niet meer konden worden afgespeeld als hun titel, artiest of andere metagegevens werden gewijzigd.

Oorzaak

Dit probleem kan optreden wanneer de FLAC-bestanden een ID3-frame bevatten vóór de FLAC-header. Het ID3-frame bevat metagegevens zoals titel en artiest. De FLAC-eigenschapshandler ging ervan uit dat alle FLAC-bestanden begonnen met de 4 byte startcode fLaC en hield geen rekening met het ID3-frame aan het begin van het bestand. Daarom zou het ID3-frame worden overschreven zonder dat de startcode fLaC het bestand onspeelbaar maakt.

Oplossing

U kunt dit probleem voorkomen voor toekomstige FLAC-muziekbestanden door de preview van 25 mei 2021—KB5003214 (builds van besturingssystemen 19041.1013, 19042.1013 en 19043.1013) te installeren.

Voer het volgende PowerShell-script uit om de betrokken FLAC-muziekbestanden te repareren.

Belangrijk

Met dit script worden de verloren metagegevens die in het ID3-frame zijn opgeslagen, niet teruggezet. Het maakt het bestand echter wel weer afspeelbaar.

  1. Open Kladblok.

  2. Kopieer en plak het volgende script in Kladblok:

    # Copyright 2021 Microsoft
    # Dit script repareert een FLAC-bestand dat beschadigd is door Media Foundation met betrekking tot KB5003430.
    # Raadpleeg KB5003430 voor meer informatie
    param(
    [parameter(Mandatory=$true,
    HelpMessage="Het pad naar het FLAC-bestand dat is beschadigd door Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Tekenreeks]$File
    )
    # We moeten een back-up maken van het huidige bestand voor het geval er fouten optreden
    $FileDirectory = Split-Path -Resolve $File
    $Filename = Split-Path -blad -oplossen $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. Deze tool repareert een FLAC-audiobestand dat beschadigd is geraakt bij het bewerken van de details.
    Write-Output 'Betrokken bestand: $FullPath'
    Write-Output 'Er wordt een back-up van het bestand gemaakt: $BackupLocation'
    Write-Output "Wil je doorgaan?"
    $choice=$host..ui.PromptForChoice("FLAC-script repareren", "Wilt u doorgaan", ('&Ja', '&Nee'), 1)
    functie 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())
    ALS ($blockSize -lt 34)
    {
    return $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    ALS ($minAudioBlockSize -lt 16 -of $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
    }
    # Als we slagen voor deze controles betekent dit waarschijnlijk dat we een stream info header hebben en het bestand opnieuw kunnen opbouwen
    Write-Output 'Bestandsinformatie' Stream'
    Write-Output "Sample Rate: $sampleRate"
    Write-Output 'Audiokanalen: $channelCount'
    Write-Output 'Voorbeelddiepte: $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)
    terwijl ($stream. ReadByte() -eq 0) {}
    # We moeten nu uitzoeken waar een geldig FLAC-metagegevensframe begint
    # We wijzen waarschijnlijk naar de laatste byte van het lid grootte, dus we zoeken 4 bytes terug en proberen het opnieuw
    $flacDataStartPosition = $stream. Positie - 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # De startcode invoegen
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    if (Testpad "$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. Sluiten()
    $fixedStream.Close()
    Move-Item - '$FullPath.tmp' forceren $FullPath
    }
  3. Klik in het menu Bestand op Opslaan.

  4. Zoek in het dialoogvenster Opslaan als de map waarin u het PowerShell-script wilt opslaan.

  5. Typ FixFlacFiles.ps1in het vak Bestandsnaam, wijzig het vak Opslaan als in Tekstdocumenten (*.txt) en klik vervolgens op Opslaan.

  6. Zoek in Windows Verkenner het PowerShell-script dat u hebt opgeslagen.

  7. Klik met de rechtermuisknop op het script en klik vervolgens op Uitvoeren met PowerShell.

  8. Typ desgevraagd de bestandsnaam van het niet-afspeelbare FLAC-bestand en druk op Enter.