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.
Avaa Muistio.
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
}Valitse Tiedosto-valikossa Tallenna.
Etsi Tallenna nimellä -valintaikkunassa kansio, johon haluat tallentaa PowerShell-komentosarjan.
Kirjoita Tiedoston nimi -ruutuun FixFlacFiles.ps1, vaihda Tallennusmuoto-ruudun asetukseksi Tekstiasiakirjat (*.txt) ja valitse sitten Tallenna.
Etsi Windowsin resurssienhallinnassa tallentamasi PowerShell-komentosarja.
Napsauta komentosarjaa hiiren kakkospainikkeella ja valitse sitten Suorita PowerShellin kanssa.
Kirjoita pyydettäessä FLAC-tiedoston tiedostonimi, jota ei voi toistaa, ja paina sitten Enter-näppäintä.