Santrauka
Šis naujinimas išsprendžia metaduomenų kodavimo problemą, dėl kurios "Free Lossless Audio Codec" (FLAC) muzikos failai tampa nebepaleidžiami, jei pakeičiamas jų pavadinimas, atlikėjas ar kiti metaduomenys.
Priežastis
Ši problema gali kilti, kai FLAC failuose yra ID3 rėmelis prieš FLAC antraštę. ID3 rėmelyje yra metaduomenų, pvz., pavadinimas ir atlikėjas. FLAC ypatybių apdorojimo programa padarė prielaidą, kad visi FLAC failai prasideda su 4 baitų pradžios kodu fLaC ir neatsižvelgia į ID3 kadrą failo pradžioje. Todėl ID3 rėmelis būtų perrašytas be pradžios kodo fLaC, todėl failas nežaidžiamas.
Sprendimas
Norėdami išvengti šios problemos būsimuose FLAC muzikos failuose, įdiekite 2021 m. gegužės 25 d. – KB5003214 (OS komponavimo versijos 19041.1013, 19042.1013 ir 19043.1013) peržiūros versiją.
Norėdami pataisyti paveiktus FLAC muzikos failus, paleiskite šį "PowerShell" scenarijų.
Svarbu
Šis scenarijus neatkurs prarastų metaduomenų, kurie buvo saugomi ID3 kadre. Tačiau tai padaro failą vėl leidžiamą.
Atidarykite užrašinę.
Nukopijuokite ir įklijuokite šį scenarijų į užrašinę:
# Autorių teisės 2021 "„Microsoft“"
# Šis scenarijus bus pataisyti FLAC failą, kuris buvo sugadintas Media Foundation nuoroda į KB5003430.
# Daugiau informacijos rasite KB5003430
param(
[parameter(Mandatory=$true,
HelpMessage="Kelias į FLAC failą, kurį sugadino Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[eilutė]$File
)
# Turime sukurti dabartinio failo atsarginę kopiją, jei turime klaidų
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path -leaf -resolve $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 taisymo įrankis. Šis įrankis pataisys FLAC garso failą, kuris buvo sugadintas redaguojant jo išsamią informaciją."
Write-Output "Paveiktas failas: $FullPath"
Write-Output "Bus sukurta atsarginė failo kopija: $BackupLocation"
Write-Output "Ar norite tęsti?"
$choice=$host.ui.PromptForChoice("FLAC scenarijaus taisymas", "Ar norite tęsti" ("&Taip", "&Ne"), 1)
funkcija ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
Jei ($blockType -ne 0)
{
Grįžties $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
Jei ($blockSize -LT 34)
{
Grįžties $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
Jei ($minAudioBlockSize -LT 16 -OR $maxAudioBlockSize -LT 16)
{
Grįžties $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) -juosta 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)
{
Grįžties $false
}
# Šių patikrų išlaikymas reiškia, kad greičiausiai turime srauto informacijos antraštę ir galime perkurti failą
Write-Output "Failo „Stream“ informacija"
Write-Output "Atrankos dažnis: $sampleRate"
Write-Output "Garso kanalai: $channelCount"
Write-Output "Pavyzdžio gylis: $bitsPerSample"
Write-Output "MD5 garso pavyzdžio maiša: $MD 5Hash"
Grįžties $true
}
If ($choice -eq 0)
{
Copy-Item $FullPath -Paskirtis $BackupLocation -Jėga
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]::Begin)
o ($stream. ReadByte() -eq 0) {}
# Dabar turime išsiaiškinti, kur prasideda galiojantis FLAC metaduomenų rėmelis
# Tikėtina, kad rodome paskutinį nario dydžio baitą, todėl ieškosime 4 baitų ir bandysime dar kartą
$flacDataStartPosition = $stream. Padėtis - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Įterpti pradžios kodą
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (bandymo kelias "$FullPath.tmp")
{
Remove-Item "$FullPath.tmp"
}
$fixedStream = [System.IO.File]::Open("$FullPath.tmp", [System.IO.FileMode]::CreateNew)
[baitas[]]$startCode = [char[]]('f', 'L', 'a', 'C');
$fixedStream.Write($startCode, 0, $startCode.Length)
$stream. CopyTo($fixedStream)
$stream. Close()
$fixedStream.Close()
Move-Item – priverstinai "$FullPath.tmp" $FullPath
}Meniu Failas spustelėkite Įrašyti.
Dialogo lange Įrašyti kaip raskite aplanką, kuriame norite įrašyti "PowerShell" scenarijų.
Lauke Failo vardas įveskite FixFlacFiles.ps1, pakeiskite lauką Įrašomo failo tipas į Teksto dokumentai (*.txt) ir spustelėkite Įrašyti.
"Windows Explorer" raskite įrašytą "PowerShell" scenarijų.
Dešiniuoju pelės mygtuku spustelėkite scenarijų, tada spustelėkite Vykdyti naudojant "PowerShell".
Kai būsite paraginti, įveskite nepaleidžiamo FLAC failo vardą ir paspauskite klavišą "Enter".