Applies ToWindows 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 problem med metadatakodning som gör att FLAC-musikfiler (Free Lossless Audio Codec) blir ouppspelade 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, till exempel titel och artist. FlaC-egenskapshanterare antas att alla FLAC-filer började med startkoden 4 byte fLaC och inte tog med ID3-ramen i början av filen i beräkningen. Därför skulle ID3-ramen skrivas över utan startkod fLaC vilket gör att filen inte går att spela upp.

Lösning

Du kan förhindra problemet för framtida FLAC-musikfiler genom att installera förhandsversionen 25 maj 2021 – KB5003214 (OS-versionerna 19041.1013, 19042.1013 och 19043.1013).

Om du vill reparera berörda FLAC-musikfiler kör du följande PowerShell-skript.

Viktigt!: Det här skriptet återställer inte förlorade metadata som lagrats i ID3-ramen. Filen kan dock spelas upp igen.

  1. Öppna Anteckningar.

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

    # Copyright 2021 Microsoft

    # Det här skriptet reparerar en FLAC-fil som har skadats av Media Foundation i referens till KB5003430.

    # Mer information finns i KB5003430

    param(

    [parameter(Mandatory=$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 behöver backa den aktuella filen om det finns fel

    $FileDirectory = Split-Path -Lös $File

    $Filename = Split-Path -Löv -lös $File

    $FullPath = Join-Path -Lös $FileDirectory $Filename

    $Filename = [Sträng]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Microsoft FLAC-reparationsverktyget. Det här verktyget reparerar en FLAC-ljudfil som var skadad när informationen redigerades."

    Write-Output "Påverkad 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 wish to continue", ('&Yes', '&No'), 1)

    funktion 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

    }

    # Passerar dessa kontroller innebär att vi förmodligen har en ströminformationsrubrik och kan återskapa filen

    Write-Output "Filströmsinformation"

    Write-Output "Exempelhastighet: $sampleRate"

    Write-Output "Ljudkanaler: $channelCount"

    Write-Output "Exempel djup: $bitsPerSample"

    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"

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

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

    # Vi behöver nu ta reda på var en giltig FLAC-metadataram börjar

    # Vi pekar förmodligen på den sista bytet av storleksmedlemmen så vi letar tillbaka 4 byte och försöker igen

    $flacDataStartPosition = $stream. Position - 4

    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)

    medan (-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 = [char[]]('f', 'L', 'a', 'C');

    $fixedStream.Write($startCode, 0, $startCode.Length)

    $stream. KopieraTill($fixedStream)

    $stream. Stäng()

    $fixedStream.Close()

    Move-Item -Force "$FullPath.tmp" $FullPath

    }

  3. Klicka på SparaArkiv-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 Windows PowerShell-skriptet du sparade i Windows Utforskaren.

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

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

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.