KB5003430: FLAC kodēts mūzikas fails tiek bojāts, kad metadati tiek rediģēti programmā Windows Explorer

Attiecas uz
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

Kopsavilkums

Šis atjauninājums novērš metadatu kodēšanas problēmu, kuras dēļ bezmaksas bezzudumu audio kodeka (FLAC) mūzikas faili kļūst neatskaņojami, ja tiek mainīts to nosaukums, izpildītājs vai citi metadati.

Iemesls

Šī problēma var rasties, ja FLAC faili satur ID3 rāmi pirms FLAC galvenes. ID3 rāmī ir metadati, piemēram, nosaukums un izpildītājs. FLAC rekvizītu apdarinātājs pieņēma, ka visi FLAC faili sākas ar 4 baitu sākuma kodu fLaC, un neņēma vērā ID3 rāmi faila sākumā. Tādēļ ID3 rāmis tiktu pārrakstīts bez sākuma koda fLaC, padarot failu neatskaņojamu.

Risinājums

Lai novērstu šo problēmu nākotnē FLAC mūzikas failiem, instalējiet 2021. gada 25. maijs — KB5003214 (OS būvējumi 19041.1013, 19042.1013 un 19043.1013) priekšskatījums.

Lai labotu ietekmētos FLAC mūzikas failus, izpildiet 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 tā padara failu atkal atskaņojamu.

  1. Atvērt programmu Piezīmjbloks.

  2. Nokopējiet un ielīmējiet piezīmjblokā tālāk norādīto skriptu:

    # Autortiesības 2021 Microsoft
    # Šis skripts labos FLAC failu, ko Media Foundation ir sabojājis saistībā ar KB5003430.
    # Papildinformāciju skatiet KB5003430
    parametrs(
    [parametrs(obligāts=$true,
    HelpMessage="Ceļš uz FLAC failu, ko sabojājis Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [Virkne]::IsNullOrEmpty($_) -and (Testa ceļš $_) })]
    [Virkne]$File
    )
    # Mums ir jādublē pašreizējais fails, ja mums ir kļūdas
    $FileDirectory = Split-Path -Atrisināt $File
    $Filename = Split-Path -leaf -resolve $File
    $FullPath = Join-Path -Resolve $FileDirectory $Filename
    $Filename = [Virkne]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DatumsLaiks]::Tagad, $Filename)
    $BackupLocation = Join-Path $FileDirectory $Filename
    Write-Output "Microsoft FLAC labošanas rīks. Šis rīks labos 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 skripta 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)
    {
    atgriešanās $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    IF ($blockSize -LT 34)
    {
    atgriešanās $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)
    {
    atgriešanās $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)
    {
    atgriešanās $false
    }
    # Šo pārbaužu veikšana nozīmē, ka, visticamāk, mums ir straumes informācijas galvene un varam pārveidot failu
    Write-Output "Faila Stream informācija"
    Write-Output "Izlases biežums: $sampleRate"
    Write-Output "Audio kanāli: $channelCount"
    Write-Output "Parauga dziļums: $bitsPerSample"
    Write-Output "MD5 audio parauga jaucējkods: $MD 5Hash"
    atgriešanās $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)
    Lai gan ($stream. ReadByte() -eq 0) {}
    # Tagad ir jānoskaidro, kur sākas derīgs FLAC metadatu ietvars
    # Mēs, visticamāk, norādām uz lieluma elementa pēdējo baitu, tāpēc meklēsim atpakaļ 4 baitus un mēģināsim vēlreiz
    $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. Aizvērt()
    $fixedStream.Close()
    Move-Item - Force "$FullPath.tmp" $FullPath
    }
  3. Izvēlnē Fails noklikšķiniet uz Saglabāt.

  4. Dialoglodziņā Saglabāt kā atrodiet mapi, kurā vēlaties saglabāt PowerShell skriptu.

  5. Lodziņā Faila nosaukums ierakstiet FixFlacFiles.ps1, mainiet lodziņu Saglabāt kā tipu uz Teksta dokumenti (*.txt) un pēc tam noklikšķiniet uz Saglabāt.

  6. Programmā Windows Explorer atrodiet saglabāto PowerShell skriptu.

  7. Ar peles labo pogu noklikšķiniet uz skripta un pēc tam noklikšķiniet uz Darbināt ar PowerShell.

  8. Kad tas tiek prasīts, ierakstiet neatskaņojamā FLAC faila nosaukumu un pēc tam nospiediet taustiņu Enter.