KB5003430: FLAC-kodet musikkfil er skadet når metadata redigeres i Windows Utforsker

Gjelder for
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

Oppsummering

Denne oppdateringen løser et problem med metadatakoding som fører til at Free Lossless Audio Codec-musikkfiler (FLAC) ikke kan spilles av hvis tittel, artist eller andre metadata endres.

Årsak

Dette problemet kan oppstå når FLAC-filene inneholder en ID3-ramme før FLAC-toppteksten. ID3-rammen inneholder metadata, for eksempel tittel og artist. FLAC-egenskapsbehandlingen antok at alle FLAC-filer startet med 4-byte startkode fLaC og ikke tok hensyn til ID3-rammen i begynnelsen av filen. Derfor ville ID3-rammen blitt overskrevet uten startkoden fLaC som gjorde filen uspillbar.

Løsning

Hvis du vil forhindre dette problemet for fremtidige FLAC-musikkfiler, installerer du 25. mai 2021 – KB5003214 (OS-bygg 19041.1013, 19042.1013 og 19043.1013) forhåndsversjon.

Hvis du vil reparere berørte FLAC-musikkfiler, kjører du følgende PowerShell-skript.

Viktig

Dette skriptet gjenoppretter ikke tapte metadata som var lagret i ID3-rammen. Det gjør imidlertid at filen kan spilles av igjen.

  1. Åpne Notisblokk.

  2. Kopier og lim inn følgende skript i notisblokken:

    # Copyright 2021 Microsoft
    # Dette skriptet reparerer en FLAC-fil som er skadet av Media Foundation i referanse til KB5003430.
    # Se KB5003430 for mer informasjon
    param(
    [parameter(Mandatory=$true,
    HelpMessage="Banen til FLAC-filen som har blitt ødelagt av Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Streng]$File
    )
    # Vi må sikkerhetskopiere den gjeldende filen i tilfelle det oppstår feil
    $FileDirectory = Split-Path -Løs $File
    $Filename = Split-Path -Leaf -Resolve $File
    $FullPath = Join-Path -Løs $FileDirectory $Filename
    $Filename = [Streng]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
    $BackupLocation = Join-Path $FileDirectory $Filename
    Write-Output «Microsoft FLAC-reparasjonsverktøy. Dette verktøyet vil reparere en FLAC-lydfil som ble skadet under redigering av detaljene."
    Write-Output «Berørt fil: $FullPath»
    Write-Output «Det lages en sikkerhetskopi av filen: $BackupLocation»
    Write-Output «Vil du fortsette?»
    $choice=$host.ui.PromptForChoice("Retter FLAC-skriptet", "Vil du fortsette", ('&Ja', '&Nei'), 1)
    function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType -bånd 0x7F
    HVIS ($blockType -ne 0)
    {
    Gå tilbake $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    IF ($blockSize -lt 34)
    {
    Gå tilbake $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    HVIS ($minAudioBlockSize -lt 16 -eller $maxAudioBlockSize -lt 16)
    {
    Gå tilbake $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) -bånd 0x7) + 1
    $bitsPerSample = (($sampleInfo -shr 4) -bånd 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)
    HVIS ($sampleRate -EQ 0)
    {
    Gå tilbake $false
    }
    # Hvis du består disse kontrollene, betyr det at vi sannsynligvis har en topptekst for dataflytinformasjon og kan gjenoppbygge filen
    Write-Output «Fil Stream informasjon»
    Write-Output «Samplingsfrekvens: $sampleRate»
    Write-Output «Lydkanaler: $channelCount»
    Write-Output «Prøvedybde: $bitsPerSample»
    Write-Output "MD5-lydeksempel-hash: $MD 5Hash"
    Returner $true
    }
    HVIS ($choice -EQ 0)
    {
    Copy-Item $FullPath -Mål $BackupLocation -Force
    $stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
    $stream. Seek(4, [System.IO.SeekOrigin]::Begin)
    while ($stream. ReadByte() -eq 0) {}
    # Vi må nå finne ut hvor en gyldig FLAC-metadataramme begynner
    # Vi peker sannsynligvis til den siste byten i størrelsesmedlemmet, så vi søker tilbake 4 byte og prøver på nytt
    $flacDataStartPosition = $stream. Posisjon - 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Sett inn startkoden
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    HVIS (Testbane $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. Klikk LagreFil-menyen.

  4. Finn mappen der du vil lagre PowerShell-skriptet, i dialogboksen Lagre som .

  5. Skriv inn FixFlacFiles.ps1i Filnavn-boksen, endre Filtype-boksen til Tekstdokumenter (*.txt), og klikk deretter Lagre.

  6. Finn PowerShell-skriptet du lagret i Windows Utforsker.

  7. Høyreklikk skriptet, og klikk deretter Kjør med PowerShell.

  8. Når du blir bedt om det, skriver du inn filnavnet på FLAC-filen som ikke kan spilles av, og trykker deretter på ENTER.