ffmpeg で一部分だけエンコード

ffmpeg というとても便利なビデオエンコーダがある。

デジカメで撮ったムービーのなかから一部分だけ抜き出して形式を変えて保存なんてことが簡単にできる。

この一部分だけ抜き出すというのは、時間を指定するのだけど、指定方法に癖がある。

ココの記事が詳しい → Seeking with FFmpeg – FFmpeg

-ss オプションで開始時間を指定するのだけど、 -ss オプション指定位置によって動作が変わる。

さらに -to オプションのカウント開始位置が変わる。

 

ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy cut.mp4

 

-i オプションの前に -ss オプション を置くと、指定した時間のあたりのキーフレームまでシークが進む。キーフレームのシークなので速いのだけど、そのかわり -ss で指定した時間ちょうどではない可能性がある。

ここで -to は、シークが終わったところを起点としてカウントするので、00:01:00 を起点として(00:00:00 とみなして) 00:02:00 まで進むので、オリジナルから見たら 00:01:00 - 00:03:00 となる。

 

ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -c copy cut.mp4

 

-i オプションの後に -ss オプション を置くと、指定した時間ちょうどまでデコードしつつ進む。保存する以外のところも時間を正確に割り出すためにデコードしてしまうので遅い。

ここで -to は、とくにシークさせていないので 00:00:00 を起点として 00:02:00 まで進むので、オリジナルから見たら 00:01:00 - 00:02:00 となる。

つまり -i オプションの前に -ss がくるか後にくるかで処理内容が変わるということだ。

というわけで、長めの動画ファイルから抜き出すときは両方指定すると素早くシークして正しい時間でエンコードできる。-to は計算が難しいから -t で指定するのが楽。

最初おおざっぱに近くまでスキップして ( -i 前の -ss )、数十秒だけは正確にデコードで進めながら指定の場所から( -i 後の -ss ) 指定の長さ ( -t ) 抜き出す、という流れ。