Bandicamで録画したav1フォーマットのファイルがQuickTimeで再生できない問題が発生したので、改善方法についてGeminiさんに相談しつつ纏めました

Bandicam AV1 MP4修復マニュアル 障害の概要と原因
Bandicam(バージョン7.x〜8.x)でAV1録画(AMD VCE/VCNやNvidia NVENCを使用)を行う際、MP4コンテナ内の管理情報(av1Cボックス)に規格外の値(Version 64)が書き込まれる不具合が発生します。

* 現象: VLC等では再生できるが、FFmpegや動画編集ソフトでは読み込み段階でエラーとなり、処理が中断される。
* 原因: FFmpegのデコーダー(libdav1d)が厳密なチェックを行うため、不正なバージョン番号を検知した瞬間に「壊れたファイル」と判断して拒絶するため。
* 特性: 映像の解像度やフレームレート情報が「壊れたヘッダー」内にしか存在しないことが多く、単純な抽出では再生速度やサイズが消失する。

——————————
2. 修復のロジック
「壊れたヘッダー」を修正するのではなく、「ヘッダーを物理的に捨て、中身の映像データ(OBU)のみを抽出し、正常なヘッダーで包み直す」という対応を行います。
FFmpegやMP4Boxは規格に厳格で読み込み自体に失敗するため、エラー耐性の高い MKVToolNix を経由させるのが唯一の解決策です。

——————————
3. 実践:修復の3ステップ(コマンド解説)
以下の3つのコマンドを順番に実行することで、無劣化(再エンコードなし)で修復が完了します。

Step 1: コンテナの正規化

mkvmerge -o "temp.mkv" "input.mp4"

* 解説: 壊れたMP4をMKV形式へ仮変換します。mkvmergeは非常にエラー耐性が高く、MP4のヘッダーが壊れていても「読める映像データ」を強引に拾い上げ、MKVの規格に整理し直してくれます。

Step 2: 映像生データの物理抽出

mkvextract "temp.mkv" tracks 0:"temp.av1"

* 解説: MKVから「映像フレームのみ」を抜き出し、.av1(生データ)として保存します。この際、エラーの原因である「Version 64」の管理情報はコンテナ側に残るため、抽出されたデータからは除去されます。

Step 3: 正常なMP4の再構築

ffmpeg -i "temp.av1" -i "input.mp4" -map 0:v -map 1:a? -c copy "fixed.mp4"

* -i temp.av1: ヘッダーのない純粋な映像データを読み込ませます。
* -i input.mp4: 音声データのみを元のファイルから引用します。
* -map 0:v -map 1:a?: 映像はStep 2の「きれいなデータ」を、音声は元のファイルを使い、音声がない場合でもエラーにしない指定です。
* -c copy: 再エンコードせず、データを詰め替えるだけなので、画質劣化はなく一瞬で終わります。
* 解説: FFmpegが生データを読み込む際、正しい管理情報(Version 1)を自動で計算して付与し、MP4を完成させます。

——————————
4. 完成版:ドラッグ&ドロップ対応バッチファイル
以下のコードを repair_av1.bat として保存し、動画ファイルをドロップするだけで自動修復が可能です。

@echo off
setlocal enabledelayedexpansion

:: ツールにパスが通っていることが前提
:loop
if "%~1"=="" goto end

set "IN=%~1"
set "TMP_MKV=%~dp1_temp_%~n1.mkv"
set "TMP_AV1=%~dp1_temp_%~n1.av1"
set "OUT=%~dp1fixed_%~n1.mp4"

echo 処理中: %~nx1

:: 1. MKVへ仮変換
mkvmerge -q -o "!TMP_MKV!" "!IN!"

:: 2. 映像データの抽出
mkvextract -q "!TMP_MKV!" tracks 0:"!TMP_AV1!"

:: 3. MP4の再構築(警告メッセージを抑制)
ffmpeg -y -loglevel fatal -i "!TMP_AV1!" -i "!IN!" -map 0:v -map 1:a? -c copy "!OUT!" 2>nul

:: 一時ファイルの削除
if exist "!TMP_MKV!" del "!TMP_MKV!"
if exist "!TMP_AV1!" del "!TMP_AV1!"

echo 完了: !OUT!
shift
goto loop

:end
pause

——————————
5. 検証済み:失敗するアプローチ(備忘録)

* パイプ処理 (|): mkvextract が標準入力からのファイル読み込みができないため、中間ファイルの作成が必要
* MP4Box: 規格に忠実なため、FFmpeg同様に BitStream Not Compliant となり停止する。
* 直接抽出 (subfile): ffprobe ですら壊れたヘッダーを読みに行ってしまい、映像の開始位置を特定できないため実用不可。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です