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.
Åbn Notesblok.
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
}Klik på Gem under menuen Filer.
I dialogboksen Gem som skal du finde den mappe, hvor du vil gemme PowerShell-scriptet.
Skriv FixFlacFiles.ps1i feltet Filnavn, og skift feltet Filtype til Tekstdokumenter (*.txt), og klik derefter på Gem.
Find det PowerShell-script, du har gemt, i Windows Stifinder.
Højreklik på scriptet, og klik derefter på Kør med PowerShell.
Når du bliver bedt om det, skal du skrive filnavnet på FLAC-filen, der ikke kan afspilles, og derefter trykke på Enter.