MP4にチャプターをつけてるんだが
どうも意図した場所にスキップしてくれないw
具体的にはチャプターを選択すると映像が2フレーム前の場所に飛ぶ
結論としてはx264の仕様でBフレームを使用すると1フレーム
さらにb-pyramidを使用でもう1フレームで計2フレーム デコードが遅延する
自分のエンコ設定ではpreset slowで使用しているので2フレーム遅延確定w
この仕様を解消するためにx264ではedtsというオプションがあるのだが
このedtsをきちんと解釈するデコーダは少なく色々と問題があって・・・
んでいろいろと解決策を試してみたその備忘録的なのを以下に書いておく
①チャプター位置を確実にキーフレームにするため–qpfileのオプションを使用
qpfileはx264でキーフレームを指定するための外部ファイルでテキスト形式
書式は
フレーム数 フレーム種類 qp値(-1でcrfモードでも自動でビットレートを割り振る)
例
0 I -1
65535 I -1
以上の書式でキーフレームを入れたいフレームを全て記述した.txtを作成する
さらにx264でエンコード時に以下のオプションを追加する ""内はqpfileのパス
–qpfile "keyframe.txt"
aviutlを使用する場合はチャプター編集プラグインで自動出力の設定をし
x264guiEXのオプションでmp4→拡張オプション→chapter.auf自動出力用を選択
さらにチャプター位置にキーフレームを設定するにチェックを入れる
これで自動的にチャプター設定を読み込んでキーフレームを指定してくれる
さて結果は・・・NG
②mp4boxのバージョンを変えてみる
古いmp4boxでは前述のedtsを解釈せず無視するバージョンもある
Yambに付属するmp4boxがかなり古いので新しいバージョンを入手
インストーラー形式なのでいらない物も含まれるので7zで開いて
中身のmp4box.exe及び.dllファイル全てをコピーする
(Yambで使用する場合はYambのインストールフォルダにコピー)
ただYambで使用するとスプリッタの表示がおかしくなるので
MY MP4Box GUI など他のツールを使用したほうがいい
aviutlならx264guiEXの①の設定でL-SMASHでチャプターも自動muxできる
結果は・・・微妙にNG→チャプター箇所によってきちんと飛んだり飛ばなかったり
ちなみに古いmp4boxでmuxすると確実に2フレームずれた場所に飛ぶっぽい
③MP4のスプリッタを変えてみる
自分はHaaliを好んで使用しているのだがMP4はLAV Splitterのほうが良いらしい
で試しに同じMP4ファイルをHaaliとLAVで再生して違いを検証すると
結果・・・LAVならほぼチャプター位置に飛べるようになった!
(きちんと飛べてるかは再生時に一時停止してチャプター移動でわかる)
Haaliはedtsの実装が今一適当な印象w
MP4ならLAV一択かと思いきやこっちはシークするとデコードが止まる事があるので
一長一短があるw
④コンテナをmkvに変えてみる
そもそもMP4自体チャプターというものがオプション扱いなので
厳密な実装はプレイヤー及びデコーダの自己責任という微妙な扱いw
そこでmkvにしたらどうでしょうと言うことでやってみる
結果は・・・GOOD! Haaliでもきちんとチャプター箇所に飛べるのを確認
というわけでチャプターがどうしても必要というときは
MP4の場合はLAVで再生して確認
どうしてもMP4でうまくいかないときは
思い切ってmkvにして保存したほうが良いかも
ズレを気にしないという手もあるがw






コメントを残す