Kopsavilkums
Šis atjauninājums novērš metadatu kodēšanas problēmu, kuras dēļ brīvzudumu audio kodeka (FLAC) mūzikas faili kļūst neatskaņojami, ja tiek mainīti to nosaukumi, izpildītāji vai citi metadati.
Cēlonis
Šī problēma var rasties, ja FLAC failos pirms FLAC galvenes ir ID3 rāmis. ID3 kadrā ir metadati, piemēram, virsrakstu un izpildītāju. FLAC rekvizīta apdarinātājs pieņem, ka visi FLAC faili tika sākti ar 4 baitu sākuma kodu fLaC un nav ņēmuši vērā ID3 kadru faila sākumā. Tāpēc ID3 kadrs tiks pārrakstīts bez sākuma koda fLaC, atveidojot failu neatskaņojamu.
Risinājums
Lai novērstu šo problēmu turpmākiem FLAC mūzikas failiem, instalējiet 2021. gada 25. maiju — KB5003214 (OS būvējumus 19041.1013, 19042.1013 un 19043.1013) Preview.
Lai labotu ietekmētos FLAC mūzikas failus, palaidiet tālāk norādīto PowerShell skriptu.
Svarīgi!: Šis skripts neatjaunos zaudētos metadatus, kas bija saglabāti ID3 rāmī. Tomēr tas nozīmē, ka fails atkal ir jāatskaņo.
-
Atveriet Piezīmjbloks.
-
Nokopējiet un ielīmējiet tālāk norādīto skriptu programmā Piezīmjbloks.
# Copyright 2021 Microsoft
# Šis skripts izlabos FLAC failu, ko Media Foundation ir sabojājis atsaucē uz KB5003430.
# Papildinformāciju skatiet rakstā KB5003430
param(
[parameter(Mandatory=$true,
HelpMessage="Ceļš uz FLAC failu, kuru ir sabojājis Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# Mums ir jādudē pašreizējais fails, ja mums ir kļūdas
$FileDirectory = Split-Path -Resolve $File
$Filename = Split-Path lapu lapu lapa — novērsiet $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 labošanas rīks. Šis rīks izlabos FLAC audio failu, kas tika bojāts, rediģējot tā informāciju."
Write-Output "Ietekmētais fails: $FullPath"
Write-Output "Tiks izveidots faila dublējums: $BackupLocation"
Write-Output "Vai vēlaties turpināt?"
$choice=$host.ui.PromptForChoice("FlaC Script labošana", "Vai vēlaties turpināt", ('&Jā', '&Nē'), 1)
funkcija ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
atgriezt $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
atgriezt $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -vai $maxAudioBlockSize -lt 16)
{
atgriezt $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 baits[] 16
$stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
if ($sampleRate -eq 0)
{
atgriezt $false
}
# Šo pārbaužu nodošana nozīmē, ka mums visdrīzāk ir straumes informācijas galvene un mēs varam atkārtoti izveidot failu
Write-Output "File Stream Information" (Failu straumes informācija)
Write-Output "Izlases ātrums: $sampleRate"
Write-Output "Audio kanāli: $channelCount"
Write-Output dziļuma paraugs: $bitsPerSample"
Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
atgriezt $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)
pēc laika ($stream. ReadByte() -eq 0) {}
# Mums tagad ir jānolasa, kur sākas derīgs FLAC metadatu kadrs
# Mēs ticam, ka norādīsim uz dalībnieka lieluma pēdējo baitu, lai mēs meklētu atpakaļ 4 baitus un vēlreiz mēģinātu
$flacDataStartPosition = $stream. Pozīcija - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Ievietot sākuma kodu
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
if (testa ceļš "$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
}
-
Izvēlnē Fails noklikšķiniet uz Saglabāt.
-
Dialoglodziņā Saglabāt kā atrodiet mapi, kurā vēlaties saglabāt PowerShell skriptu.
-
Lodziņā Faila nosaukums ierakstiet nosaukums FixFlacFiles.ps1, mainiet lodziņu Saglabāt kā tipu uz Teksta dokumenti (*.txt) un pēc tam noklikšķiniet uz Saglabāt.
-
Pārlūkā Windows atrodiet saglabāto PowerShell skriptu.
-
Ar peles labo pogu noklikšķiniet uz skripta un pēc tam noklikšķiniet uz Palaist ar PowerShell.
-
Pēc uzaicinājuma ierakstiet neatskaņojamā FLAC faila nosaukumu un pēc tam nospiediet taustiņu Enter.