Applies ToWindows 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 sa týka problému s kódovaním metaúdajov, ktorý spôsobuje, že hudobné súbory Free Lossless Audio Codec (FLAC) sa stanú neprehrateľnými v prípade zmeny ich názvu, interpreta alebo iných metaúdajov. 

Príčina

Tento problém sa môže vyskytnúť, keď súbory FLAC obsahujú rám ID3 pred hlavičkou FLAC. Rám ID3 obsahuje metaúdaje, ako napríklad názov a umelec. Obslužný program vlastnosti FLAC predpokladal, že všetky súbory FLAC sa začali kódom začiatku 4 bajtov fLaC a neberú do úvahy rám ID3 na začiatku súboru. Z tohto dôvodu sa rám ID3 prepíše bez prehrateho kódu začiatku, pri vykresľovaní súboru nie je možné prehrať.

Riešenie

Ak chcete zabrániť tomuto problému v budúcich hudobných súboroch FLAC, nainštalujte 25. mája 2021 – KB5003214 (zostavy OS 19041.1013, 19042.1013 a 19043.1013) Preview.

Ak chcete opraviť hudobné súbory FLAC, ktorých sa týka, spustite nasledujúci skript prostredia PowerShell.

Dôležité: Tento skript obnoví stratené metaúdaje, ktoré boli uložené v ráme ID3. Tým sa však súbor znova prehrá.

  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ý je poškodený program Media Foundation, s odkazom na KB5003430.

    # Ďalšie informácie nájdete v téme KB5003430

    param(

    [parameter(Povinné=$true;

    HelpMessage="Cesta k súboru FLAC, ktorý je poškodený aplikáciou Media Foundation",

    ValueFromRemainingArguments=$true)]

    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]

    [Reťazec]$File

    )

    # Musíme zálohovať aktuálny súbor pre všetky chyby

    $FileDirectory = Split-Path – vyriešiť $File

    $Filename = Split-Path -Listové riešenie $File

    $FullPath = Join-Path – vyriešiť $FileDirectory $Filename

    $Filename = [Reťazec]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DátumAČas]::Teraz, $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 jeho podrobností.

    Write-Output "Ovplyvnený súbor: $FullPath"

    Write-Output Sa vytvorí záloha súboru: $BackupLocation.

    Write-Output "Chcete pokračovať?"

    $choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue" (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átiť $false

    }

    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())

    if ($blockSize -lt 34)

    {

    vrátiť $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)

    {

    vrátiť $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)

    {

    vrátiť $false

    }

    # Prenesenie týchto kontrol znamená, že pravdepodobne máme hlavičku s informáciami o streame a môžeme opätovne zostaviť súbor

    Write-Output Informácie o streame súboru

    Write-Output "Vzorová sadzba: $sampleRate"

    Write-Output "Zvukové kanály: $channelCount"

    Write-Output Ukážková hĺbka: $bitsPerSample

    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"

    vrátiť $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)

    zatiaľ čo ($stream. ReadByte() -eq 0) {}

    # Teraz musíme zistiť, kde sa začína platný rám metaúdajov FLAC

    # Pravdepodobne ukazovame na posledný bajt člena veľkosti, aby sme vrátili 4 bajty a zopakovali pokusy

    $flacDataStartPosition = $stream. Position - 4

    $stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)

    while (-not(ParseStreamInfoMetadataBlock($stream)))

    {

    $flacDataStartPosition = $flacDataStartPosition + 1

    $stream. Seek($flacDataStartPosition; [System.IO.SeekOrigin]::Begin)

    }

    # Vloženie kódu začatia

    $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.Dĺžka)

    $stream. CopyTo($fixedStream)

    $stream. Close()

    $fixedStream.Close()

    Move-Item -Force "$FullPath.tmp" $FullPath

    }

  3. V ponuke Súbor kliknite na položku 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 text FixFlacFiles.ps1 , zmeňte pole Uložiť vo formáte na Textové dokumenty (*.txt) a potom kliknite na tlačidlo Uložiť.

  6. V 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ť pomocou prostredia PowerShell.

  8. Po zobrazení výzvy zadajte názov súboru, ktorý nie je možné prehrať, a stlačte kláves Enter.

Potrebujete ďalšiu pomoc?

Chcete ďalšie možnosti?

Môžete preskúmať výhody predplatného, prehľadávať školiace kurzy, naučiť sa zabezpečiť svoje zariadenie a ešte oveľa viac.

Komunity pomôžu s kladením otázok a odpovedaním na ne, s poskytovaním pripomienok a so získavaním informácií od odborníkov s bohatými znalosťami.