Samenvatting
Met deze update wordt een probleem met metagegevenscoderen opgelost waardoor muziekbestanden zonder verlies (FLAC) niet meer kunnen worden weergegeven als de titel, artiest of andere metagegevens worden gewijzigd.
Oorzaak
Dit probleem kan optreden wanneer de FLAC-bestanden een ID3-frame bevatten vóór de FLAC-koptekst. Het id3-frame bevat metagegevens, zoals titel en artiest. De flac-eigenschapsverwerker ging ervan uit dat alle FLAC-bestanden zijn gestart met de FLaC-begincode van 4 byte en dat er geen rekening is gehouden met het ID3-frame aan het begin van het bestand. Daarom wordt het ID3-frame overschreven zonder dat de startcode fLaC het bestand onbespeelbaar maakt.
Oplossing
Als u dit probleem wilt voorkomen voor toekomstige FLAC-muziekbestanden, installeert u de preview-versie van 25 mei 2021—KB5003214 (OS Builds 19041.1013, 19042.1013 en 19043.1013).
Als u getroffen FLAC-muziekbestanden wilt herstellen, moet u het volgende PowerShell-script uitvoeren.
Belangrijk: Met dit script worden de verloren metagegevens die zijn opgeslagen in het ID3-frame niet hersteld. Het bestand kan echter wel opnieuw worden afspelen.
-
Open Kladblok.
-
Kopieer en plak het volgende script in kladblok:
# Copyright 2021 Microsoft
# Dit script herstelt een FLAC-bestand dat is beschadigd door Media Foundation in verwijzing naar 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 als er fouten zijn
$FileDirectory = Split-Path -Los $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Los $FileDirectory $Filename
$Filename = [Tekenreeks]::Opmaak("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Nu, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output 'Microsoft FLAC Repair Tool. Met dit hulpprogramma wordt een FLAC-audiobestand hersteld dat beschadigd is bij het bewerken van de details.
Write-Output 'Affected File: $FullPath'
Write-Output 'Er wordt een back-up van het bestand gemaakt: $BackupLocation'
Write-Output 'Wilt u doorgaan?'
$choice=$host.ui.PromptForChoice("Fix FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)
functie ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
als ($blockType -ne 0)
{
retourn $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
als ($blockSize -lt 34)
{
retourn $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)
{
retourn $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. Lezen($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
als ($sampleRate -eq 0)
{
retourn $false
}
# Als we deze controles uitvoeren, hebben we waarschijnlijk een streaminfokop en kunnen we het bestand opnieuw opbouwen
Write-Output 'File Stream Information'
Write-Output "Sample Rate: $sampleRate"
Write-Output 'Audiokanalen: $channelCount'
Write-Output "Sample Depth: $bitsPerSample"
Write-Output 'MD5 Audio Sample Hash: $MD 5Hash'
return $true
}
als ($choice -eq 0)
{
Copy-Item $FullPath -Destination $BackupLocation -Force
$stream = [System.IO.File]::Openen($FullPath, [System.IO.FileMode]::Openen)
$stream. Seek(4; [System.IO.SeekOrigin]::Begin)
terwijl ($stream. ReadByte() -eq 0) {}
# We moeten nu uitzoeken waar een geldig FRAME met METAGEGEVENS voor FLAC begint
# We wijzen waarschijnlijk naar de laatste byte van het groottelid, zodat we 4 bytes terug gaan zoeken en opnieuw proberen
$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 (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. Sluiten()
$fixedStream.Sluiten()
Move-Item -Forceer "$FullPath.tmp" $FullPath
}
-
Klik in het menu Bestand op Opslaan.
-
Zoek in het dialoogvenster Opslaan als de map waarin u het PowerShell-script wilt opslaan.
-
Typ in het vak BestandsnaamFixFlacFiles.ps1, wijzig het vak Opslaan als in Tekstdocumenten (*.txt) en klik vervolgens op Opslaan.
-
Zoek in Windows Explorer het PowerShell-script dat u hebt opgeslagen.
-
Klik met de rechtermuisknop op het script en klik vervolgens op Uitvoeren met PowerShell.
-
Wanneer u daarom wordt gevraagd, typt u de bestandsnaam van het niet-bespeelbare FLAC-bestand en drukt u op Enter.