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

Yhteenveto

Tämä päivitys korjaa metatietojen koodausongelman, jonka vuoksi FLAC (Free Lossless Audio Codec) -musiikkitiedostot eivät ole toistamattomia, jos niiden otsikkoa, esittäjää tai muita metatietoja muutetaan. 

Syy

Tämä ongelma saattaa ilmetä, kun FLAC-tiedostoissa on ID3-kehys ennen FLAC-otsikkoa. ID3-kehys sisältää metatietoja, kuten otsikon ja esittäjän. FLAC-ominaisuuskäsittelijä olettaa, että kaikki FLAC-tiedostot aloitettiin 4 tavun aloituskoodilla mutta eivät ottaneet huomioon ID3-kehystä tiedoston alussa. Sen vuoksi ID3-kehys korvattiin ilman, että aloituskoodi hahmonnettiin niin, että tiedostoa ei voi toistaa.

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) Preview.

Jos haluat korjata FLAC-musiikkitiedostot, joita ongelma koskee, suorita seuraava PowerShell-komentosarja.

Tärkeää: Tämä komentosarja ei palauta kadonneet metatiedot, jotka on tallennettu ID3-kehykseen. Se kuitenkin tekee tiedostosta toistettavan uudelleen.

  1. Avaa Muistio.

  2. Kopioi ja liitä seuraava komentosarja muistioon:

    # Copyright 2021 Microsoft

    # Tämä komentosarja korjaa FLAC-tiedoston, jonka Media Foundation on vioittunut KB5003430-viittauksessa.

    # Katso lisätietoja artikkelista KB5003430

    param(

    [parameter(Mandatory=$true,

    HelpMessage="Media Foundationin vioittuneen FLAC-tiedoston polku",

    ValueFromRemainingArguments=$true)]

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

    [Merkkijono]$File

    )

    # Nykyisen tiedoston korjaaminen on varmuuskopioittava, jos virheitä ilmenee

    $FileDirectory = Split-Path -Ratkaise $File

    $Filename = Split-Path -lehti -ratkaise $File

    $FullPath = Join-Path -Ratkaise $FileDirectory $Filename

    $Filename = [Merkkijono]::Format("Backup_{0:yyyyMMdd_hhmmss}_{1}", [DateTime]::Now, $Filename)

    $BackupLocation = Join-Path $FileDirectory $Filename

    Write-Output "Microsoft FLAC Repair Tool. Tämä työkalu korjaa FLAC-äänitiedoston, joka vioittui muokattaessa sen tietoja."

    Write-Output "Ongelmallinen tiedosto: $FullPath"

    Write-Output "Tiedostosta tehdään varmuuskopio: $BackupLocation"

    Write-Output "Haluatko jatkaa?"

    $choice=$host.ui.PromptForChoice("Fixing FLAC Script", "Do you wish to continue", ('&Yes', '&No'), 1)

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

    {

    $blockType = $stream. ReadByte()

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

    $blockType = $blockType -band 0x7F

    if ($blockType -ne 0)

    {

    palauta $false

    }

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

    if ($blockSize -lt 34)

    {

    palauta $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)

    {

    palauta $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 tavu[] 16

    $stream. Read($MD 5HashBytes, 0, $MD 5HashBytes.Length)

    $MD 5Hash = [Guid]($MD 5HashBytes)

    if ($sampleRate -eq 0)

    {

    palauta $false

    }

    # Ohita nämä tarkistukset tarkoittaa, että meillä on todennäköisesti stream info header ja voimme rakentaa tiedoston uudelleen

    Write-Output "Tiedostovirtatiedot"

    Write-Output "Otosnopeus: $sampleRate"

    Write-Output äänikanavat: $channelCount

    Write-Output "Sample Depth: $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)

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

    # Meidän on nyt selvitettävä, mistä kelvollinen FLAC-metatietokehys alkaa

    # Osoitamme todennäköisesti kokojäsenen viimeistä tavua, joten etsimme neljä tavua 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)

    }

    # Lisää aloituskoodi

    $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)

    [tavu[]]$startCode = [merkki[]]('f', 'L', 'a', 'C');

    $fixedStream.Kirjoitus($startCode, 0, $startCode.Pituus)

    $stream. KopioiTo($fixedStream)

    $stream. Close()

    $fixedStream.Close()

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

    }

  3. Valitse Tiedosto-valikossaTallenna.

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

  5. Kirjoita Tiedostonimi-ruutuunFixFlacFiles.ps1, muuta Tallennusmuoto-ruuduksi Tekstiasiakirjat (*.txt) ja valitse sitten Tallenna.

  6. Etsi Windows Resurssienhallinnassa PowerShell-komentosarja, jonka tallensit.

  7. Napsauta komentosarjaa hiiren kakkospainikkeella ja valitse suorita PowerShellin avulla.

  8. Kirjoita pyydettäessä toistamattoman FLAC-tiedoston tiedostonimi ja paina sitten Enter-näppäintä.

Tarvitsetko lisäohjeita?

Haluatko lisää vaihtoehtoja?

Tutustu tilausetuihin, selaa harjoituskursseja, opi suojaamaan laitteesi ja paljon muuta.

Osallistumalla yhteisöihin voit kysyä kysymyksiä ja vastata niihin, antaa palautetta sekä kuulla lisää asiantuntijoilta, joilla on runsaasti tietoa.