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.
-
Avaa Muistio.
-
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
}
-
Valitse Tiedosto-valikossaTallenna.
-
Etsi Tallenna nimellä -valintaikkunasta kansio, johon haluat tallentaa PowerShell-komentosarjan.
-
Kirjoita Tiedostonimi-ruutuunFixFlacFiles.ps1, muuta Tallennusmuoto-ruuduksi Tekstiasiakirjat (*.txt) ja valitse sitten Tallenna.
-
Etsi Windows Resurssienhallinnassa PowerShell-komentosarja, jonka tallensit.
-
Napsauta komentosarjaa hiiren kakkospainikkeella ja valitse suorita PowerShellin avulla.
-
Kirjoita pyydettäessä toistamattoman FLAC-tiedoston tiedostonimi ja paina sitten Enter-näppäintä.