ffmpeg でtsからmp4に変換しようとしたら、”fail to compensate for timestamp delta …”を延々と吐き続けるファイルがありました。
エンコードも途中で終わって再生できません。エンコードにリトライしたら、たまたま最後までエンコードしたように見えても途中から音声が出ません。
こんなとき、
-async 1
にしたら、ひとまず最後までエンコードできました。
もとのオプションは-async 1000でした。
ここで、asyncは音声の同期方法の指定オプションです。
- 最新ffmpegの高度なオプション (ffmpegのドキュメンテーションの日本語訳。)
- ffmpeg Documentation (本家のドキュメンテーション。同様の記載があります。)
値は、音がズレたときに1秒間で何サンプルまで変更していいかを指定する
-async 1 は特別で、音声の最初だけ同期して後続のサンプルはそのまま
とあります。
どうやら、同期するために変更する時に失敗していたようです。
このファイルだけの問題なのか、他の問題なのかは分かっていません。 今のところ他のファイルでは遭遇していません。
ffmpegのメーリング・リストには、似たような例のレポートがあります。(少し読みにくい)
- [FFmpeg-user] Problems with ffmpeg (スレッドの最初のメール)
- [FFmpeg-user] Problems with ffmpeg (同じスレッドの別メール)
上の2番目のリンクで -async 1について言及があったので、ためしてみたのです。メールの内容はオプションから -async 1 を削除したらどうかというものですが。