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

概要

この更新プログラムは、タイトル、アーティスト、その他のメタデータが変更された場合に 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 フレームに格納された失われたメタデータは復元されません。 ただし、ファイルが再び再生可能になります。

  1. [メモ帳] を開きます。

  2. 次のスクリプトをコピーしてメモ帳に貼り付けます。

    # 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

    }

  3. [ファイル] メニューの [保存] をクリックします。

  4. [名前 を付けて保存 ] ダイアログ ボックスで、PowerShell スクリプトを保存するフォルダーを探します。

  5. [ファイル名] ボックスに「FixFlacFiles.ps1」と入力し、[ファイルの種類] ボックスを [テキスト ドキュメント(*.txt)に変更し、[保存] をクリックします

  6. [Windows エクスプローラーで、保存した PowerShell スクリプトを探します。

  7. スクリプトを右クリックし 、[PowerShell で実行] をクリックします

  8. メッセージが表示されたら、再生できない FLAC ファイルのファイル名を入力し、Enter キーを 押します

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。