Rezime
Ova ispravka rešava problem sa kodingom metapodataka koji izaziva da muzičke datoteke bez gubitka (FLAC) postanu neupotrebljive ako se promene njihov naslov, izvođač ili drugi metapodaci.
Uzrok
Do ovog problema može doći kada FLAC datoteke sadrže ID3 okvir pre zaglavlja FLAC. Okvir ID3 sadrži metapodatake kao što su naslov i izvođači. Rukovalac svojstvom FLAC pretpostavio je da su sve FLAC datoteke započete pomoću početnog koda od 4 bajta fLaC i da nisu uzimale u obzir okvir ID3 na početku datoteke. Stoga, ID3 okvir bi bio zamenen bez početnog koda fLaC-a koji ne može da se igra.
Rezolucija
Da biste sprečili ovaj problem za buduće flaC muzičke datoteke, instalirajte 25. maj 2021. – KB5003214 (izdanja operativnog sistema 19041.1013, 19042.1013 i 19043.1013) Preview.
Da biste popravili FLAC muzičke datoteke, pokrenite sledeću PowerShell skriptu.
Važno: Ova skripta neće vratiti izgubljene metapodatake uskladištene u ID3 okviru. Međutim, to ponovo čini da datoteka može da se reprodukuje.
-
Otvorite Beležnica.
-
Kopirajte i nalepite sledeću skriptu u beležnicu:
# Copyright 2021 Microsoft
# Ova skripta će popraviti FLAC datoteku koju je media Foundation oštećen u referenci za KB5003430.
# Pogledajte KB5003430 da biste dobili dodatne informacije
param(
[parameter(Obavezno=$true,
HelpMessage="Putanja do FLAC datoteke koju je oštećeno u programu Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[Niska]$File
)
# Moramo da vratimo trenutnu inkasu datoteci bez grešaka.
$FileDirectory = Split-Path -Reši $File
$Filename = Split-Path -Leaf -Resolve $File
$FullPath = Join-Path -Reši $FileDirectory $Filename
$Filename = [Niska]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)
$BackupLocation = Join-Path $FileDirectory $Filename
Write-Output "Microsoft FLAC alatka za popravku. Ova alatka popravlja AUDIO datoteku FLAC koja je oštećena prilikom uređivanja detalja."
Write-Output "Datoteka na koju ovo utiče: $FullPath"
Write-Output "Pravi se rezervna kopija datoteke: $BackupLocation"
Write-Output "Želite li da nastavite?"
$choice=$host.ui.PromptForChoice("Popravljanje FLAC skripte", "Želite li da nastavite", ('&Da', '&Ne'), 1)
funkcija 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())
if ($blockSize -lt 34)
{
return $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -or $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
}
# Ako prođete ove provere, to znači da verovatno imamo zaglavlje sa informacijama o toku i da možemo da obnovimo datoteku
Write-Output "Informacije o toku datoteke"
Write-Output "Uzorak stope: $sampleRate"
Write-Output "Audio Channels: $channelCount"
Write-Output "Dubina uzorka: $bitsPerSample"
Write-Output "MD5 hash: $MD 5Hash"
return $true
}
if ($choice -eq 0)
{
Copy-Item $FullPath -odredište $BackupLocation -Sila
$stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
$stream. Seek(4, [System.IO.SeekOrigin]:Begin)
pritisnuto ($stream. ReadByte() -eq 0) {}
# Sada treba da otkrijemo gde počinje važeći okvir FLAC metapodataka
# Verovatno upućivamo na poslednji bajt veličine člana tako da ćemo potražiti 4 bajta i ponovo potražiti
$flacDataStartPosition = $stream. Pozicija - 4
$stream. Seek($flacDataStartPosition, [System.iO.SeekOrigin]:Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.iO.SeekOrigin]:Begin)
}
# Umetanje početnog koda
$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. Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
U meniju Datoteka izaberite stavku Sačuvaj.
-
U dijalogu Sačuvaj kao pronađite fasciklu u kojoj želite da sačuvate PowerShell skriptu.
-
U polju Ime datoteke otkucajte FixFlacFiles.ps1 i promenite polje Sačuvaj kao tip u Tekstualni dokumenti (*.txt), a zatim kliknite na dugme Sačuvaj.
-
U Windows pronađite Sačuvanu PowerShell skriptu.
-
Kliknite desnim tasterom miša na skriptu i izaberite stavku Pokreni sa programom PowerShell.
-
Kada se to od vas zatraži, otkucajte ime datoteke koja nije reprodukcija FLAC datoteka, a zatim pritisnite taster Enter.