概要
この更新プログラムは、タイトル、アーティスト、その他のメタデータが変更された場合に Free Lossless Audio Codec (FLAC) 音楽ファイルが再生不能になるメタデータ エンコードの問題に対応します。
原因
この問題は、FLAC ファイルに FLAC ヘッダーの前に ID3 フレームが含まれている場合に発生する可能性があります。 ID3 フレームには、タイトルやアーティストなどのメタデータが含まれています。 FLAC プロパティ ハンドラーは、すべての FLAC ファイルが 4 バイトの開始コード fLaC で開始され、ファイルの先頭の ID3 フレームを考慮に入れなかったことを前提としました。 そのため、ID3 フレームは、開始コード fLaC を使用せずに上書きされ、ファイルが再生不能になります。
解決策
将来の FLAC 音楽ファイルでこの問題を回避するには 、KB5003214 (OS ビルド 19041.1013、19042.1013、および 19043.1013) プレビュー を 2021年 5 月 25 日にインストールします。
影響を受ける FLAC 音楽ファイルを修復するには、次の PowerShell スクリプトを実行します。
重要: このスクリプトでは、ID3 フレームに格納された失われたメタデータは復元されません。 ただし、ファイルが再び再生可能になります。
-
[メモ帳] を開きます。
-
次のスクリプトをコピーしてメモ帳に貼り付けます。
# Copyright 2021 Microsoft
# このスクリプトは、KB5003430 を参照して Media Foundation によって破損した FLAC ファイルを修復します。
# 詳細については、KB5003430 を参照してください。
param(
[parameter(Mandatory=$true,
HelpMessage="Media Foundation によって破損した FLAC ファイルへのパス"、
ValueFromRemainingArguments=$true)]
[ValidateScript({ -not [String]::IsNullOrEmpty($_) -and (Test-Path $_) })]
[String]$File
)
# エラーがある場合は、現在のファイルをバックアップする必要があります
$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 修復ツール。 このツールは、その詳細を編集するときに破損した FLAC オーディオ ファイルを修復します。"
Write-Output影響を受けるファイル: $FullPath"
Write-Output "ファイルのバックアップが作成されます: $BackupLocation"
Write-Output続行しますか?」
$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)
{
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
}
# これらのチェックを渡すということは、ストリーム情報ヘッダーがある可能性が高く、ファイルを再構築できる
Write-Output ストリーム情報] を選択します。
Write-Outputサンプル レート: $sampleRate"
Write-Output オーディオ チャンネル: $channelCount"
Write-Output"Sample Depth: $bitsPerSample"
Write-Output MD5 オーディオ サンプル ハッシュ: $MD 5Hash"
return $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)
while ($stream。ReadByte() -eq 0) {}
# 有効な FLAC メタデータ フレームの開始場所を確認する必要があります
# サイズ メンバーの最後のバイトを指している可能性が高いので、4 バイトをシークして再試行します。
$flacDataStartPosition = $stream。位置 - 4
$stream。Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
while (-not(ParseStreamInfoMetadataBlock($stream)))
{
$flacDataStartPosition = $flacDataStartPosition + 1
$stream。Seek($flacDataStartPosition, [System.IO.SeekOrigin]::Begin)
}
# 開始コードを挿入する
$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。CopyTo($fixedStream)
$stream。Close()
$fixedStream.Close()
Move-Item -Force "$FullPath.tmp" $FullPath
}
-
[ファイル] メニューの [保存] をクリックします。
-
[名前 を付けて保存 ] ダイアログ ボックスで、PowerShell スクリプトを保存するフォルダーを探します。
-
[ファイル名] ボックスに「FixFlacFiles.ps1」と入力し、[ファイルの種類] ボックスを [テキスト ドキュメント(*.txt)に変更し、[保存] をクリックします。
-
[Windows エクスプローラーで、保存した PowerShell スクリプトを探します。
-
スクリプトを右クリックし 、[PowerShell で実行] をクリックします。
-
メッセージが表示されたら、再生できない FLAC ファイルのファイル名を入力し、Enter キーを 押します。