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.
-
Öppna Anteckningar.
-
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
}
-
Klicka på Spara på Arkiv-menyn.
-
Leta reda på den mapp där du vill spara PowerShell-skriptet i dialogrutan Spara som.
-
I rutan Filnamn skriver du FixFlacFiles.ps1, ändrar rutan Filformat till Textdokument (*.txt) och klickar sedan på Spara.
-
Leta Windows PowerShell-skriptet du sparade i Windows Utforskaren.
-
Högerklicka på skriptet och klicka sedan på Kör med PowerShell.
-
När du uppmanas till det anger du filnamnet på den ospelbara FLAC-filen och trycker sedan på Retur.