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

Shrnutí

Tato aktualizace řeší problém s kódováním metadat, který způsobuje, že hudební soubory free lossless audio codec (FLAC) se nehrají, pokud se změní jejich název, interpret nebo jiná metadata. 

Příčina

K tomuto problému může dojít, když soubory FLAC obsahují rámeček ID3 před záhlavím FLAC. Rámeček ID3 obsahuje metadata, jako je název a interpret. Obslužná rutina vlastnosti FLAC předpokládá, že všechny soubory FLAC začaly se 4 byte počátečním kódem fLaC a nezohlední rámec ID3 na začátku souboru. Proto by se rámec ID3 přepsal bez počátečního kódu fLaC, který by soubor přehrál.

Řešení

Abyste tomuto problému zabránili u budoucích hudebních souborů FLAC, nainstalujte si 25. května 2021 – KB5003214 (buildy operačního systému 19041.1013, 19042.1013 a 19043.1013) Preview.

Pokud chcete opravit ovlivněné hudební soubory FLAC, spusťte následující skript PowerShellu.

Důležité informace: Tento skript obnoví ztracená metadata uložená v rámci ID3. Soubor ale bude znovu možné přehrát.

  1. Otevřete Poznámkový blok.

  2. Zkopírujte a vložte následující skript do poznámkového bloku:

    # Copyright 2021 Microsoft

    # Tento skript opraví soubor FLAC, který je v odkazu na KB5003430 poškozený společností Media Foundation.

    # Další informace najdete v článku KB5003430.

    param(

    [parameter(Mandatory=$true;

    HelpMessage="Cesta k souboru FLAC, který je poškozený pomocí Media Foundation",

    ValueFromRemainingArguments=$true)]

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

    [String]$File

    )

    # Musíme zálohovat aktuální soubor v případě, že máme nějaké chyby.

    $FileDirectory = Split-Path -Vyřešit $File

    $Filename = Split-Path -Leaf -Resolve $File

    $FullPath = Join-Path -Vyřešit $FileDirectory $Filename

    $Filename = [String]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [Datum a čas]::Teď, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Nástroj pro opravu Microsoft FLAC. Tento nástroj opraví zvukový soubor FLAC, který byl při úpravách jeho podrobností poškozený."

    Write-Output "Ovlivněný soubor: $FullPath"

    Write-Output "Bude provedena záloha souboru: $BackupLocation"

    Write-Output "Chcete pokračovat?"

    $choice=$host.ui.PromptForChoice("Oprava skriptu FLAC", "Chcete pokračovat", ('&Ano', '&Ne'), 1)

    funkce ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)

    {

    $blockType = $stream. ReadByte()

    $lastBlock = ($blockType -shr 7) -ne 0

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    vrátit $false

    }

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

    if ($blockSize -lt 34)

    {

    vrátit $false

    }

    $minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    $maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()

    if ($minAudioBlockSize -lt 16 - nebo $maxAudioBlockSize -lt 16)

    {

    vrátit $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átit $false

    }

    # Předání těchto kontrol znamená, že pravděpodobně máme záhlaví s informacemi o datovém proudu a můžeme soubor znovu sestavit.

    Write-Output "File Stream Information" (Informace o datovém proudu souborů)

    Write-Output "Vzorkovací frekvence: $sampleRate"

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

    Write-Output "Ukázka hloubky: $bitsPerSample"

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

    vrátit $true

    }

    if ($choice -eq 0)

    {

    Copy-Item $FullPath -Destination $BackupLocation -Force

    $stream = [System.IO.File]::Open($FullPath; [System.IO.FileMode]::Open)

    $stream. Hledání(4, [System.IO.SeekOrigin]::Begin)

    while ($stream. ReadByte() -eq 0) {}

    # Teď musíme zjistit, kde začíná platný rámec metadat FLAC.

    # Pravděpodobně nasedáme na poslední bajt člena velikosti, takže vyhledáme 4 bajty a zopakujeme to

    $flacDataStartPosition = $stream. Pozice – 4

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

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

    {

    $flacDataStartPosition = $flacDataStartPosition + 1

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

    }

    # Vložení počátečního kódu

    $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. Zavřít()

    $fixedStream.Close()

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

    }

  3. V nabídce Soubor klikněte na Uložit.

  4. V dialogovém okně Uložit jako vyhledejte složku, do které chcete uložit skript PowerShellu.

  5. Do pole Název souboru zadejte FixFlacFiles.ps1, změňte pole Uložit jako typ na Textové dokumenty (*.txt) a potom klikněte na Uložit.

  6. V Windows Exploreru najděte skript PowerShellu, který jste uložili.

  7. Klikněte pravým tlačítkem myši na skript a potom klikněte na Spustit s PowerShellem.

  8. Po zobrazení výzvy zadejte název souboru souboru FLAC, který se nehraje, a stiskněte Enter.

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.