KB5003430: Glazbena datoteka kodirana FLAC-om oštećena je kada se metapodaci uređuju u programu Windows Explorer

Primjenjuje se na
Windows 10 Enterprise, version 2004 Windows 10 Home and Pro, version 2004 Windows 10 Pro, version 2004 Windows 10 Enterprise and Education, version 2004 Windows 10 Pro Education, version 2004 Windows 10 Pro for Workstations, version 2004 Windows 10 Pro, version 20H2 Windows 10 Enterprise, version 20H2 Windows 10 Enterprise and Education, version 20H2 Windows 10 Home and Pro, version 20H2 Windows 10 Pro Education, version 20H2 Windows 10 Pro for Workstations, version 20H2

Sažetak

Ovo ažuriranje rješava problem šifriranja metapodataka koji uzrokuje nemogućnost reprodukcije glazbenih datoteka Free Lossless Audio Codec (FLAC) ako se promijeni njihov naslov, izvođač ili drugi metapodaci.

Uzrok

Taj se problem može pojaviti kada FLAC datoteke sadrže okvir ID3 prije zaglavlja FLAC. Okvir ID3 sadrži metapodatke kao što su naslov i izvođač. Rukovatelj svojstava FLAC pretpostavlja da sve FLAC datoteke počinju s 4-bajtnim početnim kodom fLaC i ne uzima u obzir okvir ID3 na početku datoteke. Stoga bi okvir ID3 bio prebrisan bez početnog koda fLaC, što bi datoteku učinilo nemogućom za reprodukciju.

Rješenje

Da biste spriječili taj problem za buduće FLAC glazbene datoteke, instalirajte pretpregled od 25. svibnja 2021. – KB5003214. (međuverzije OS-a 19041.1013, 19042.1013 i 19043.1013).

Da biste popravili zahvaćene FLAC glazbene datoteke, pokrenite sljedeću skriptu komponente PowerShell.

Važno

Ova skripta neće vratiti izgubljene metapodatke koji su bili pohranjeni u okviru ID3. No zbog toga je datoteka opet moguće reproducirati.

  1. Otvaranje bloka za pisanje.

  2. Kopirajte i zalijepite sljedeću skriptu u blok za pisanje:

    # Autorska prava 2021 Microsoft
    # Ova skripta će popraviti FLAC datoteku koju je Media Foundation oštetio u vezi s KB5003430.
    # Dodatne informacije potražite u članku KB5003430
    param(
    [parameter(Obavezno=$true,
    HelpMessage="Put do FLAC datoteke koju je oštetio Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Niz]$File
    )
    # Moramo sigurnosno kopirati trenutnu datoteku u slučaju da postoje pogreške
    $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 "Microsoftov alat za popravak FLAC. Ovaj alat će popraviti FLAC audiodatoteku koja je oštećena prilikom uređivanja njezinih detalja."
    Write-Output "Zahvaćena datoteka: $FullPath"
    Write-Output "Izradit će se sigurnosna kopija datoteke: $BackupLocation"
    Write-Output "Želite li nastaviti?"
    $choice=$host.ui.PromptForChoice("Popravljanje FLAC skripte", "Želite li nastaviti", ('&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)
    {
    Povrat $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    Povrat $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)
    {
    Povrat $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 bajt[] 16
    $stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)
    $MD 5Hash = [Guid]($MD 5HashBytes)
    IF ($sampleRate -EQ 0)
    {
    Povrat $false
    }
    # Ako prođete ove provjere, vjerojatno imamo zaglavlje informacija o strujanju i možemo ponovno izgraditi datoteku
    Write-Output "Podaci o Stream datoteke"
    Write-Output "Stopa uzorkovanja: $sampleRate"
    Write-Output "Audiokanali: $channelCount"
    Write-Output "Dubina uzorka: $bitsPerSample"
    Write-Output "MD5 Audio sample Hash: $MD 5Hash"
    Povrat $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)
    while ($stream. ReadByte() -eq 0) {}
    # Sada moramo shvatiti odakle počinje valjani FLAC okvir metapodataka
    # Vjerojatno pokazujemo na zadnji bajt člana veličine pa ćemo potražiti natrag 4 bajta i pokušati ponovno
    $flacDataStartPosition = $stream. Položaj - 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Umetanje početne šifre
    $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
    }
  3. Na izborniku Datoteka kliknite Spremi.

  4. U dijaloškom okviru Spremanje u obliku pronađite mapu u koju želite spremiti skriptu komponente PowerShell.

  5. U okvir Naziv datoteke upišite FixFlacFiles.ps1, promijenite okvir Spremi u obliku u Tekstni dokumenti (*.txt), a zatim kliknite Spremi.

  6. U programu Windows Explorer pronađite spremljenu skriptu komponente PowerShell.

  7. Desnom tipkom miša kliknite skriptu, a zatim kliknite Pokreni pomoću komponente PowerShell.

  8. Kada se to od vas zatraži, upišite naziv datoteke FLAC datoteke koja se ne može reproducirati, a zatim pritisnite Enter.