Samenvatting
Deze update verhelpt een probleem met de codering van metagegevens dat ertoe leidde dat FLAC-muziekbestanden (Free Lossless Audio Codec) niet meer konden worden afgespeeld als hun titel, artiest of andere metagegevens werden gewijzigd.
Oorzaak
Dit probleem kan optreden wanneer de FLAC-bestanden een ID3-frame bevatten vóór de FLAC-header. Het ID3-frame bevat metagegevens zoals titel en artiest. De FLAC-eigenschapshandler ging ervan uit dat alle FLAC-bestanden begonnen met de 4 byte startcode fLaC en hield geen rekening met het ID3-frame aan het begin van het bestand. Daarom zou het ID3-frame worden overschreven zonder dat de startcode fLaC het bestand onspeelbaar maakt.
Oplossing
U kunt dit probleem voorkomen voor toekomstige FLAC-muziekbestanden door de preview van 25 mei 2021—KB5003214 (builds van besturingssystemen 19041.1013, 19042.1013 en 19043.1013) te installeren.
Voer het volgende PowerShell-script uit om de betrokken FLAC-muziekbestanden te repareren.
Belangrijk
Met dit script worden de verloren metagegevens die in het ID3-frame zijn opgeslagen, niet teruggezet. Het maakt het bestand echter wel weer afspeelbaar.
Open Kladblok.
Kopieer en plak het volgende script in Kladblok:
# Copyright 2021 Microsoft
# Dit script repareert een FLAC-bestand dat beschadigd is door Media Foundation met betrekking tot KB5003430.
# Raadpleeg KB5003430 voor meer informatie
param(
[parameter(Mandatory=$true,
HelpMessage="Het pad naar het FLAC-bestand dat is beschadigd door Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Tekenreeks]$File
)
# We moeten een back-up maken van het huidige bestand voor het geval er fouten optreden
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -blad -oplossen $File
$FullPath = Join-Path -Resolve $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC Repair Tool. Deze tool repareert een FLAC-audiobestand dat beschadigd is geraakt bij het bewerken van de details.
Write-Output 'Betrokken bestand: $FullPath'
Write-Output 'Er wordt een back-up van het bestand gemaakt: $BackupLocation'
Write-Output "Wil je doorgaan?"
$choice=$host..ui.PromptForChoice("FLAC-script repareren", "Wilt u doorgaan", ('&Ja', '&Nee'), 1)
functie ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType-band 0x7F
if ($blockType -ne 0)
{
return $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
ALS ($blockSize -lt 34)
{
return $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
ALS ($minAudioBlockSize -lt 16 -of $maxAudioBlockSize -lt 16)
{
return $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)
{
return $false
}
# Als we slagen voor deze controles betekent dit waarschijnlijk dat we een stream info header hebben en het bestand opnieuw kunnen opbouwen
Write-Output 'Bestandsinformatie' Stream'
Write-Output "Sample Rate: $sampleRate"
Write-Output 'Audiokanalen: $channelCount'
Write-Output 'Voorbeelddiepte: $bitsPerSample'
Write-Output 'MD5 Audio Sample Hash: $MD 5Hash'
return $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)
terwijl ($stream. ReadByte() -eq 0) {}
# We moeten nu uitzoeken waar een geldig FLAC-metagegevensframe begint
# We wijzen waarschijnlijk naar de laatste byte van het lid grootte, dus we zoeken 4 bytes terug en proberen het opnieuw
$flacDataStartPosition = $stream. Positie - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# De startcode invoegen
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (Testpad "$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. Sluiten()
$fixedStream.Close()
Move-Item - '$FullPath.tmp' forceren $FullPath
}Klik in het menu Bestand op Opslaan.
Zoek in het dialoogvenster Opslaan als de map waarin u het PowerShell-script wilt opslaan.
Typ FixFlacFiles.ps1in het vak Bestandsnaam, wijzig het vak Opslaan als in Tekstdocumenten (*.txt) en klik vervolgens op Opslaan.
Zoek in Windows Verkenner het PowerShell-script dat u hebt opgeslagen.
Klik met de rechtermuisknop op het script en klik vervolgens op Uitvoeren met PowerShell.
Typ desgevraagd de bestandsnaam van het niet-afspeelbare FLAC-bestand en druk op Enter.