Oppsummering
Denne oppdateringen løser et problem med metadatakoding som fører til at Free Lossless Audio Codec-musikkfiler (FLAC) ikke kan spilles av hvis tittel, artist eller andre metadata endres.
Årsak
Dette problemet kan oppstå når FLAC-filene inneholder en ID3-ramme før FLAC-toppteksten. ID3-rammen inneholder metadata, for eksempel tittel og artist. FLAC-egenskapsbehandlingen antok at alle FLAC-filer startet med 4-byte startkode fLaC og ikke tok hensyn til ID3-rammen i begynnelsen av filen. Derfor ville ID3-rammen blitt overskrevet uten startkoden fLaC som gjorde filen uspillbar.
Løsning
Hvis du vil forhindre dette problemet for fremtidige FLAC-musikkfiler, installerer du 25. mai 2021 – KB5003214 (OS-bygg 19041.1013, 19042.1013 og 19043.1013) forhåndsversjon.
Hvis du vil reparere berørte FLAC-musikkfiler, kjører du følgende PowerShell-skript.
Viktig
Dette skriptet gjenoppretter ikke tapte metadata som var lagret i ID3-rammen. Det gjør imidlertid at filen kan spilles av igjen.
Åpne Notisblokk.
Kopier og lim inn følgende skript i notisblokken:
# Copyright 2021 Microsoft
# Dette skriptet reparerer en FLAC-fil som er skadet av Media Foundation i referanse til KB5003430.
# Se KB5003430 for mer informasjon
param(
[parameter(Mandatory=$true,
HelpMessage="Banen til FLAC-filen som har blitt ødelagt av Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Streng]$File
)
# Vi må sikkerhetskopiere den gjeldende filen i tilfelle det oppstår feil
$FileDirectory = Split-Path -Løs $File
$Filename = Split-Path -Leaf -Resolve $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-reparasjonsverktøy. Dette verktøyet vil reparere en FLAC-lydfil som ble skadet under redigering av detaljene."
Write-Output «Berørt fil: $FullPath»
Write-Output «Det lages en sikkerhetskopi av filen: $BackupLocation»
Write-Output «Vil du fortsette?»
$choice=$host.ui.PromptForChoice("Retter FLAC-skriptet", "Vil du fortsette", ('&Ja', '&Nei'), 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)
{
Gå tilbake $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
IF ($blockSize -lt 34)
{
Gå tilbake $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)
{
Gå tilbake $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 -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)
HVIS ($sampleRate -EQ 0)
{
Gå tilbake $false
}
# Hvis du består disse kontrollene, betyr det at vi sannsynligvis har en topptekst for dataflytinformasjon og kan gjenoppbygge filen
Write-Output «Fil Stream informasjon»
Write-Output «Samplingsfrekvens: $sampleRate»
Write-Output «Lydkanaler: $channelCount»
Write-Output «Prøvedybde: $bitsPerSample»
Write-Output "MD5-lydeksempel-hash: $MD 5Hash"
Returner $true
}
HVIS ($choice -EQ 0)
{
Copy-Item $FullPath -Mål $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 må nå finne ut hvor en gyldig FLAC-metadataramme begynner
# Vi peker sannsynligvis til den siste byten i størrelsesmedlemmet, så vi søker tilbake 4 byte og prøver på nytt
$flacDataStartPosition = $stream. Posisjon - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Sett inn startkoden
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
HVIS (Testbane $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. Close()
$fixedStream.Close()
Move-Item -Force «$FullPath.tmp»-$FullPath
}Klikk Lagre på Fil-menyen.
Finn mappen der du vil lagre PowerShell-skriptet, i dialogboksen Lagre som .
Skriv inn FixFlacFiles.ps1i Filnavn-boksen, endre Filtype-boksen til Tekstdokumenter (*.txt), og klikk deretter Lagre.
Finn PowerShell-skriptet du lagret i Windows Utforsker.
Høyreklikk skriptet, og klikk deretter Kjør med PowerShell.
Når du blir bedt om det, skriver du inn filnavnet på FLAC-filen som ikke kan spilles av, og trykker deretter på ENTER.