KB5003430: Hudobný súbor vo formáte FLAC je poškodený pri úprave metaúdajov v programe Windows Prieskumník

Vzťahuje sa 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

Súhrn

Táto aktualizácia rieši problém s kódovaním metaúdajov, ktorý spôsobuje, že hudobné súbory Free Lossless Audio Codec (FLAC) sa stanú neprehrávateľnými, ak sa zmení ich názov, interpret alebo iné metaúdaje.

Príčina

Tento problém sa môže vyskytnúť, keď súbory FLAC obsahujú snímku ID3 pred hlavičkou FLAC. Rám ID3 obsahuje metaúdaje, ako sú napríklad názov a interpret. Obslužný program vlastnosti FLAC predpokladal, že všetky súbory FLAC začínali so 4 bajtovým počiatočným kódom fLaC a nezohľadňovali rámec ID3 na začiatku súboru. Preto by sa rám ID3 prepísal bez toho, aby počiatočný kód fLaC spôsobil, že súbor by sa nedal prehrať.

Riešenie

Ak chcete zabrániť tomuto problému pre budúce hudobné súbory FLAC, nainštalujte 25. mája 2021 – KB5003214 (zostavy OS 19041.1013, 19042.1013 a 19043.1013) Verzia Preview.

Ak chcete opraviť ovplyvnené hudobné súbory FLAC, spustite nasledujúci skript prostredia PowerShell.

Dôležité

Tento skript neobnoví stratené metaúdaje, ktoré boli uložené v rámci ID3. Umožňuje však opätovné prehratie súboru.

  1. Otvorte program Poznámkový blok.

  2. Skopírujte a prilepte nasledujúci skript do poznámkového bloku:

    # Autorské práva 2021 Microsoft
    # Tento skript opraví súbor FLAC, ktorý bol poškodený spoločnosťou Media Foundation v súvislosti s KB5003430.
    # Ďalšie informácie nájdete v KB5003430
    param(
    [parameter(Mandatory=$true,
    HelpMessage="Cesta k súboru FLAC, ktorý bol poškodený nadáciou Media Foundation",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [reťazec]$File
    )
    # Aktuálny súbor musíme zálohovať pre prípad, že sa vyskytnú nejaké chyby
    $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 Repair Tool. Tento nástroj opraví zvukový súbor FLAC, ktorý bol poškodený pri úprave podrobností."
    Write-Output Ovplyvnený súbor: $FullPath
    Write-Output "Vytvorí sa záloha súboru: $BackupLocation"
    Write-Output "Chcete pokračovať?"
    $choice=$host.ui.PromptForChoice("Oprava skriptu FLAC"; "Chcete pokračovať"; ("&Áno", "&Nie"), 1)
    function ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType -band 0x7F
    If ($blockType -ne 0)
    {
    vrátenie $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    vrátenie $false
    }
    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
    if ($minAudioBlockSize -lt 16 -alebo $maxAudioBlockSize -lt 16)
    {
    vrátenie $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)
    {
    vrátenie $false
    }
    # Ak prejdete týmito kontrolami, znamená to, že pravdepodobne máme hlavičku s informáciami o streame a súbor môžeme znova vytvoriť
    Write-Output "Informácie o súbore Stream"
    Write-Output Vzorkovacia frekvencia: $sampleRate
    Write-Output "Audio Channels: $channelCount"
    Write-Output Hĺbka vzorky: $bitsPerSample
    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
    return $true
    }
    if ($choice -eq 0)
    {
    Copy-Item $FullPath – cieľ $BackupLocation – vynútiť
    $stream = [System.IO.File]::Open($FullPath, [System.IO.FileMode]::Open)
    $stream. Seek(4; [System.IO.SeekOrigin]::Begin)
    while ($stream. ReadByte() -eq 0) {}
    # Teraz musíme zistiť, kde začína platný rámec metaúdajov FLAC
    # Pravdepodobne ukazujeme na posledný bajt člena veľkosti, takže vyhľadáme späť 4 bajty a skúsime to znova
    $flacDataStartPosition = $stream. Pozícia – 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Vloženie počiatočného kódu
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    if (testovacia cesta "$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 Vynútenie $FullPath.tmp $FullPath
    }
  3. V ponuke Súbor kliknite na príkaz Uložiť.

  4. V dialógovom okne Uložiť ako vyhľadajte priečinok, do ktorého chcete uložiť skript prostredia PowerShell.

  5. Do poľa Názov súboru zadajte FixFlacFiles.ps1, zmeňte pole Uložiť vo formáte na Textové dokumenty (*.txt) a potom kliknite na tlačidlo Uložiť.

  6. Vo Windows Prieskumníkovi vyhľadajte skript prostredia PowerShell, ktorý ste uložili.

  7. Kliknite pravým tlačidlom myši na skript a potom kliknite na položku Spustiť v prostredí PowerShell.

  8. Po zobrazení výzvy zadajte názov súboru neprehrávaného súboru FLAC a stlačte kláves Enter.