Sammendrag
Denne oppdateringen tar for seg et problem med metadatakoding som fører til at flac-musikkfiler (Free Lossless Audio Codec) 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 startkoden fLaC på 4 byte og ikke tok hensyn til ID3-rammen i begynnelsen av filen. ID3-rammen vil derfor bli overskrevet uten at startkoden fLaC gjengir filen som ikke kan spilles av.
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) Preview.
Hvis du vil reparere berørte FLAC-musikkfiler, kjører du følgende PowerShell-skript.
Viktig!: Dette skriptet gjenoppretter ikke tapte metadata som ble lagret i ID3-rammen. Filen kan imidlertid spilles av på nytt.
-
Å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(Obligatorisk=$true,
HelpMessage="Banen til FLAC-filen som er skadet av Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Streng]$File
)
# Vi må sikkerhetskopiere gjeldende fil incase vi har eventuelle feil
$FileDirectory = Split-Path -Løs $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Løs $FileDirectory $Filename
$Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output «Reparasjonsverktøy for Microsoft FLAC. Dette verktøyet reparerer en FLAC-lydfil som ble skadet når du redigerte detaljene.»
Write-Output «Berørt fil: $FullPath»
Write-Output «En sikkerhetskopi av filen vil bli laget: $BackupLocation»
Write-Output «Vil du fortsette?»
$choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)
funksjon ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
hvis ($blockType -ne 0)
{
returner $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
hvis ($blockSize -lt 34)
{
returner $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)
{
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 5HashByte = New-Object byte[] 16
$stream. Read($MD 5HashBytes; 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
hvis ($sampleRate -eq 0)
{
returner $false
}
# Hvis du sender disse kontrollene, betyr det at vi sannsynligvis har en strøminformasjonsoverskrift og kan gjenoppbygge filen
Write-Output «Filstrømsinformasjon»
Write-Output «Eksempelfrekvens: $sampleRate»
Write-Output «Lydkanaler: $channelCount»
Write-Output «Eksempeldybde: $bitsPerSample»
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
returner $true
}
hvis ($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 ($stream. ReadByte() -eq 0) {}
# Vi må nå finne ut hvor en gyldig FLAC-metadataramme begynner
# Vi peker sannsynligvis på den siste byten i størrelsesmedlemmet, slik at 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)
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. Lukk()
$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.ps1 i Filnavn-boksen, endre Filtype-boksen til Tekstdokumenter (*.txt), og klikk deretter Lagre.
-
Finn PowerShell-skriptet du lagret i Windows Explorer.
-
Høyreklikk skriptet, og klikk deretter Kjør med PowerShell.
-
Når du blir bedt om det, skriver du inn filnavnet til FLAC-filen som ikke kan spilles av, og deretter trykker du ENTER.