Oversigt
Denne opdatering løser et problem med kodning af metadata, der medfører, at musikfiler uden tabulatorlyd (FLAC) bliver uafspilelige, hvis deres titel, kunstner eller andre metadata ændres.
Årsag
Dette problem kan opstå, når FLAC-filerne indeholder en ID3-ramme før FLAC-overskriften. ID3-rammen indeholder metadata, f.eks. titel og kunstner. FLAC-egenskabsbehandleren antagede, at alle FLAC-filer startede med startkoden 4 byte fLaC og ikke tog højde for ID3-rammen i starten af filen. Derfor overskrives ID3-rammen, uden at startkoden fLaC gengiver filen uafspilbar.
Løsning
For at undgå dette problem for fremtidige FLAC-musikfiler skal du installere 25. maj 2021 – KB5003214 (OS Builds 19041.1013, 19042.1013 og 19043.1013) Preview.
For at reparere påvirkede FLAC-musikfiler skal du køre følgende PowerShell-script.
Vigtigt!: Dette script gendanner ikke de mistede metadata, der blev gemt i ID3-rammen. Men filen kan afspilles 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 i reference til KB5003430.
# Se KB5003430 for at få flere oplysninger
param(
[parameter(Mandatory=$true,
HelpMessage="Stien til FLAC-filen, der er blevet beskadiget af Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Streng]$File
)
# Vi er nødt til at sikkerhedskopiere den aktuelle fil, hvis der opstår fejl
$FileDirectory = Split-Path -Løs $File
$Filename = Split-Path -blad -løs $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-reparationsværktøj. Dette værktøj reparerer en FLAC-lydfil, der blev beskadiget, når du redigerer oplysningerne."
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("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)
function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -khr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
returner $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
returner $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -or $maxAudioBlockSize -lt 16)
{
returner $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)
{
returner $false
}
# Hvis du videregiver disse kontroller, betyder det, at vi sandsynligvis har en overskrift for streamoplysninger og kan genopbygge filen
Write-Output "Filstream-oplysninger"
Write-Output "Eksempelsats: $sampleRate"
Write-Output "Lydkanaler: $channelCount"
Write-Output "Prøve dybde: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
returner $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)
mens du ($stream. ReadByte() -eq 0) {}
# Vi er nu nødt til at finde ud af, hvor en gyldig FLAC-metadataramme begynder
# Vi peger sandsynligvis på den sidste byte af 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 = [char[]]('f', 'L', 'a', 'C');
$fixedStream.Write($startCode, 0, $startCode.Length)
$stream. CopyTo($fixedStream)
$stream. Luk()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
Klik på Gem i menuen Filer.
-
I dialogboksen Gem som skal du finde den mappe, hvor du vil gemme PowerShell-scriptet.
-
I feltet Filnavn skal du skriveFixFlacFiles.ps1 , ændre feltet Filtype til Tekstdokumenter (*.txt) og derefter klikke på Gem.
-
Find Windows PowerShell-script, du gemte, i 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å den ikke-afspillede FLAC-fil og derefter trykke på Enter.