KB5003430: FLAC-koodattu musiikkitiedosto vioittuu, kun metatietoja muokataan Resurssienhallinnassa

Käytetään kohteeseen
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

Yhteenveto

Tämä päivitys korjaa metatietojen koodausongelman, jonka vuoksi FLAC (Free Lossless Audio Codec) -musiikkitiedostoja ei voi toistaa, jos niiden nimeä, esittäjää tai muita metatietoja muutetaan.

Syy

Tämä ongelma saattaa ilmetä, kun FLAC-tiedostot sisältävät ID3-kehyksen ennen FLAC-otsikkoa. ID3-kehys sisältää metatietoja, kuten otsikon ja esittäjän. FLAC-ominaisuuskäsittelijä oletti, että kaikki FLAC-tiedostot alkoivat 4-tavuisella aloituskoodilla fLaC, eikä ottanut huomioon tiedoston alun ID3-kehystä. Tämän vuoksi ID3-kehys korvattaisiin ilman, että aloituskoodi fLaC tekisi tiedostosta pelaamattoman.

Ratkaisu

Voit estää tämän ongelman tulevissa FLAC-musiikkitiedostoissa asentamalla 25. toukokuuta 2021 – KB5003214 (käyttöjärjestelmän koontiversiot 19041.1013, 19042.1013 ja 19043.1013) esikatselun.

Voit korjata FLAC-musiikkitiedostot, joissa ongelma ilmenee, suorittamalla seuraavan PowerShell-komentosarjan.

Tärkeää

Tämä komentosarja ei palauta ID3-kehykseen tallennettuja kadonneita metatietoja. Se kuitenkin tekee tiedostosta uudelleen toistettavan.

  1. Avaa Muistio.

  2. Kopioi ja liitä seuraava komentosarja Muistioon:

    # Tekijänoikeus 2021 Microsoft
    # Tämä komentosarja korjaa FLAC-tiedoston, jonka Media Foundation on vioittanut KB5003430 viitaten.
    # Lisätietoja on KB5003430
    parametri(
    [parametri(Pakollinen=$true,
    HelpMessage="Media Foundationin vioittaman FLAC-tiedoston polku",
    ValueFromRemainingArguments=$true)]
    [ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
    [Merkkijono]$File
    )
    # Nykyinen tiedosto on varmuuskopioitava siltä varalta, että virheitä ilmenee
    $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 -korjaustyökalu. Tämä työkalu korjaa FLAC-äänitiedoston, joka vioittui muokattaessa sen tietoja."
    Write-Output "Tiedosto, jota ongelma koskee: $FullPath"
    Write-Output "Tiedosto varmuuskopioidaan: $BackupLocation"
    Write-Output "Haluatko jatkaa?"
    $choice=$host.ui.PromptForChoice("FLAC-komentosarjan korjaaminen", "Haluatko jatkaa", ('&Kyllä', '&Ei'), 1)
    funktio ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
    {
    $blockType = $stream. ReadByte()
    $lastBlock = ($blockType -shr 7) -ne 0
    $blockType = $blockType -band 0x7F
    if ($blockType -ne 0)
    {
    Return $false
    }
    $blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
    if ($blockSize -lt 34)
    {
    Return $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)
    {
    Return $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)
    {
    Return $false
    }
    # Näiden tarkistusten läpäiseminen tarkoittaa, että meillä on todennäköisesti virran tietojen otsikko ja voimme luoda tiedoston uudelleen
    Write-Output "Tiedoston Stream tiedot"
    Write-Output "Näytteenottotaajuus: $sampleRate"
    Write-Output "Äänikanavat: $channelCount"
    Write-Output "Näytteen syvyys: $bitsPerSample"
    Write-Output "MD5 Audio Sample Hash: $MD 5Hash"
    Palauta $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)
    kun ($stream. ReadByte() -eq 0) {}
    # Meidän on nyt selvitettävä, mistä kelvollinen FLAC-metatietokehys alkaa
    # Osoitamme todennäköisesti koko jäsenen viimeistä tavua, joten etsimme 4 tavua taaksepäin ja yritämme uudelleen
    $flacDataStartPosition = $stream. Sijainti – 4
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    while (-not(ParseStreamInfoMetadataBlock($stream)))
    {
    $flacDataStartPosition = $flacDataStartPosition + 1
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    }
    # Aloituskoodin lisääminen
    $stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
    if (testipolku "$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 -Pakota "$FullPath.tmp" $FullPath
    }
  3. Valitse Tiedosto-valikossa Tallenna.

  4. Etsi Tallenna nimellä -valintaikkunassa kansio, johon haluat tallentaa PowerShell-komentosarjan.

  5. Kirjoita Tiedoston nimi -ruutuun FixFlacFiles.ps1, vaihda Tallennusmuoto-ruudun asetukseksi Tekstiasiakirjat (*.txt) ja valitse sitten Tallenna.

  6. Etsi Windowsin resurssienhallinnassa tallentamasi PowerShell-komentosarja.

  7. Napsauta komentosarjaa hiiren kakkospainikkeella ja valitse sitten Suorita PowerShellin kanssa.

  8. Kirjoita pyydettäessä FLAC-tiedoston tiedostonimi, jota ei voi toistaa, ja paina sitten Enter-näppäintä.