KB5003430: FLAC-kodet musikfil er beskadiget, når metadata redigeres i Windows Stifinder

Gælder 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

Sammendrag

Denne opdatering løser et problem med metadatakodning, som medfører, at FLAC-musikfiler (Free Lossless Audio Codec) ikke kan afspilles, hvis deres titel, kunstner eller andre metadata ændres.

Årsag

Dette problem kan opstå, når FLAC-filerne indeholder en ID3-ramme før FLAC-headeren. ID3-rammen indeholder metadata såsom titel og kunstner. FLAC-egenskabsbehandleren antog, at alle FLAC-filer startede med fLaC-startkoden på 4 byte og ikke tog højde for ID3-rammen i starten af filen. Derfor vil ID3-rammen blive overskrevet, uden at startkoden fLaC gør filen uafspillelig.

Løsning

Hvis du vil forhindre dette problem for fremtidige FLAC-musikfiler, skal du installere prøveversionen af 25. maj 2021 – KB5003214 (OS Builds 19041.1013, 19042.1013 og 19043.1013).

Hvis du vil reparere berørte FLAC-musikfiler, skal du køre følgende PowerShell-script.

Vigtig

Dette script gendanner ikke de mistede metadata, der blev gemt i ID3-rammen. Det gør dog filen afspillelig igen.

  1. Åbn Notesblok.

  2. Kopiér og indsæt følgende script i Notesblok:

    # Copyright 2021 Microsoft
    # Dette script reparerer en FLAC-fil, der er blevet beskadiget af Media Foundation med henvisning til KB5003430.
    # Se KB5003430 for yderligere oplysninger
    param(
    [parameter(Mandatory=$true,
    HelpMessage="Stien til FLAC-filen, der er blevet beskadiget af Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [Streng]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Streng]$File
    )
    # Vi er nødt til at sikkerhedskopiere den aktuelle fil i tilfælde af, at der opstår fejl
    $FileDirectory = Split-Path -Resolve $File
    $Filename = Split-Path -Leaf -Resolve $File
    $FullPath = Join-Path -Resolve $FileDirectory $Filename
    $Filename = [Streng]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
    $BackupLocation = Join-Path $FileDirectory $Filename
    Write-Output "Microsoft FLAC-reparationsværktøj. Dette værktøj vil reparere en FLAC-lydfil, der blev beskadiget, da du redigerede dens detaljer."
    Write-Output "Berørt fil: $FullPath"
    Write-Output "Der oprettes en sikkerhedskopi af filen: $BackupLocation"
    Write-Output "Vil du fortsætte?"
    $choice=$host.ui.PromptForChoice("Retter FLAC-scriptet", "Vil du fortsætte", ('&Ja', '&Nej'), 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)
    {
    returnere $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    returnere $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)
    {
    returnere $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 -bånd 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 -ækvat 0)
    {
    returnere $false
    }
    # Hvis du består disse kontroller, betyder det, at vi sandsynligvis har en stream info-header, og vi kan genopbygge filen
    Write-Output "Filer Stream oplysninger"
    Write-Output "Prøvefrekvens: $sampleRate"
    Write-Output "Lydkanaler: $channelCount"
    Write-Output "Sample Depth: $bitsPerSample"
    Write-Output "MD5-lydeksempel på hash: $MD 5Hash"
    Returner $true
    }
    HVIS ($choice -ækvat 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) {}
    # Vi skal nu finde ud af, hvor en gyldig FLAC-metadataramme begynder
    # Vi peger sandsynligvis på den sidste byte i medlemmets størrelse, så vi søger 4 byte tilbage og prøver igen
    $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)
    }
    # Indsæt 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 = [tegn[]]('f', 'L', 'a', 'C');
    $fixedStream.Write($startCode, 0, $startCode.Length)
    $stream. KopiTil($fixedStream)
    $stream. Close()
    $fixedStream.Close()
    Move-Item -Force "$FullPath.tmp" $FullPath
    }
  3. Klik på Gem under menuen Filer.

  4. I dialogboksen Gem som skal du finde den mappe, hvor du vil gemme PowerShell-scriptet.

  5. Skriv FixFlacFiles.ps1i feltet Filnavn, og skift feltet Filtype til Tekstdokumenter (*.txt), og klik derefter på Gem.

  6. Find det PowerShell-script, du har gemt, i Windows Stifinder.

  7. Højreklik på scriptet, og klik derefter på Kør med PowerShell.

  8. Når du bliver bedt om det, skal du skrive filnavnet på FLAC-filen, der ikke kan afspilles, og derefter trykke på Enter.