Ringkasan
Pembaruan ini mengatasi masalah pengodean metadata yang menyebabkan file musik Free Lossless Audio Codec (FLAC) menjadi tidak dapat diputar jika judul, artis, atau metadata lainnya diubah.
Penyebab
Masalah ini mungkin terjadi jika file FLAC berisi bingkai ID3 sebelum header FLAC. Bingkai ID3 berisi metadata seperti judul dan artis. Penanganan properti FLAC mengasumsikan bahwa semua file FLAC dimulai dengan kode mulai 4 byte fLaC dan tidak memperhitungkan bingkai ID3 di awal file. Oleh karena itu, bingkai ID3 akan ditimpa tanpa kode mulai fLaC membuat file tidak dapat diputar.
Resolusi
Untuk mencegah masalah ini pada file musik FLAC yang akan datang, instal 25 Mei 2021—KB5003214 (Build OS 19041.1013, 19042.1013, dan 19043.1013) Pratinjau.
Untuk memperbaiki file musik FLAC yang terpengaruh, jalankan skrip PowerShell berikut.
Penting
Skrip ini tidak akan memulihkan metadata hilang yang disimpan dalam bingkai ID3. Namun, itu membuat file dapat diputar lagi.
Buka Notepad.
Salin dan tempelkan skrip berikut ke notepad:
# Hak Cipta 2021 Microsoft
# Skrip ini akan memperbaiki file FLAC yang telah dirusak oleh Media Foundation sehubungan dengan KB5003430.
# Lihat KB5003430 untuk informasi lebih lanjut
param(
[parameter(Wajib=$true,
HelpMessage="Jalur ke file FLAC yang telah dirusak oleh Media Foundation",
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [string]::IsNullOrEmpty($_) -and (test-path $_) })]
[string]$File
)
# Kami perlu mencadangkan file saat ini jika kami memiliki kesalahan
$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 "Alat Perbaikan Microsoft FLAC. Alat ini akan memperbaiki file audio FLAC yang rusak saat mengedit detailnya."
Write-Output "File yang terpengaruh: $FullPath"
Write-Output "Pencadangan file akan dibuat: $BackupLocation"
Write-Output "Apakah Anda ingin melanjutkan?"
$choice=$host.ui.PromptForChoice("Memperbaiki Skrip FLAC", "Apakah Anda ingin melanjutkan", ('&Ya', '&Tidak'), 1)
fungsi ParseStreamInfoMetadataBlock([System.IO.FileStream]$stream)
{
$blockType = $stream. ReadByte()
$lastBlock = ($blockType -shr 7) -ne 0
$blockType = $blockType -band 0x7F
if ($blockType -ne 0)
{
Kembali $false
}
$blockSize = (($stream. ReadByte() -shl 16) -bor ($stream. ReadByte() -shl 8) -bor $stream. ReadByte())
if ($blockSize -lt 34)
{
Kembali $false
}
$minAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
$maxAudioBlockSize = ($stream. ReadByte() -shl 8) -bor $stream. ReadByte()
if ($minAudioBlockSize -lt 16 -atau $maxAudioBlockSize -lt 16)
{
Kembali $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. Baca($MD 5HashBytes, 0, $MD 5HashBytes.Length)
$MD 5Hash = [Guid]($MD 5HashBytes)
IF ($sampleRate -EQ 0)
{
Kembali $false
}
# Lulus pemeriksaan ini berarti kemungkinan kami memiliki header info aliran dan dapat menyusun ulang file
Write-Output "File Stream Informasi"
Write-Output "Laju sampel: $sampleRate"
Write-Output "Saluran audio: $channelCount"
Write-Output "Kedalaman sampel: $bitsPerSample"
Write-Output "Hash Sampel Audio MD5: $MD 5Hash"
Kembali $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)
sementara ($stream. ReadByte() -eq 0) {}
# Sekarang kita perlu mencari tahu di mana bingkai metadata FLAC yang valid dimulai
# Kami kemungkinan menunjuk ke byte terakhir dari anggota ukuran sehingga kami akan mencari kembali 4 byte dan mencoba lagi
$flacDataStartPosition = $stream. Posisi - 4
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream. Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# Menyisipkan kode mulai
$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. Salin Ke($fixedStream)
$stream. Tutup()
$fixedStream.Tutup()
Move-Item -Force "$FullPath.tmp" $FullPath
}Pada menu File, klik Simpan.
Dalam kotak dialog Simpan Sebagai , temukan folder tempat Anda ingin menyimpan skrip PowerShell.
Dalam kotak Nama file , ketik FixFlacFiles.ps1, ubah kotak Simpan sebagai tipe menjadi Dokumen Teks (*.txt), lalu klik Simpan.
Di Windows Explorer, temukan skrip PowerShell yang Anda simpan.
Klik kanan skrip, lalu klik Jalankan dengan PowerShell.
Saat diminta, ketik nama file FLAC yang tidak dapat diputar, lalu tekan Enter.