OS:Ubuntu Server 12.04
FFmpeg: 2.8.14
動画ファイルの一部をうまい具合に切り出してそのシーンばかり楽しみたい、という動機にもとづいてffmpegを用いるものである。
-ssオプションで切り出しの開始時刻を指定し、終了時刻を-toオプションで示してやる。動画vid.mkvの3分8秒の地点から3分17秒の地点までの9秒間を切り出すためにはこんな具合である。
$ ffmpeg -ss 03:08 -i vid.mkv -to 00:09 -c copy cut.mkv
-ssオプションを-iオプションの前へ遣るか後ろに置くかで-toオプションの挙動が転じてしまうので細やかな注意を要する。
-iオプションよりも手前に-ssオプションを設置した場合、切り出し開始時刻の03:08を00:00と捉える。すると9秒後の時刻は勿論00:09ということにある。-ssの位置取りが-iよりも手前であると、キーフレームにもとづいて処理をするから大変迅速だということである。
一方、-iオプションよりも後方へ-ssオプションを構える場合は動画のタイムスタンプをそのまま用いる。こちらは処理が遅いということであったけれども、テストで使用した動画ファイルでは-ssを-iの前においた場合と然程変化は見られなかった。
$ ffmpeg -i vid.mkv -ss 3:08 -to 3:17 -c copy cut.mkv
なお、切り出す時間を計算して割り出すのが面倒な向きには-copytsオプションを追加する。これで-ssオプションが-iオプションより手前にあっても動画のタイムスタンプをそのまま解釈させられると云うことであった。
$ ffmpeg -ss 03:08 -i vid.mkv -to 03:17 -c copy -copyts cut.mkv
然しながら切り取った動画は最初の5秒間が真っ黒で困った。どうも-c copy
オプションはIフレームでのみ切断可能のようである。元となる動画のどこにIフレームが挟みこまれているのかを確認してみるとこういう具合であった。
$ ffprobe -show_frames -select_streams v -show_entries frame=pkt_pts_time,pict_type vid.mkv | grep -B1 "=I" (snip) -- pkt_pts_time=186.645000 pict_type=I -- pkt_pts_time=193.652000 pict_type=I
3分8秒(=188秒)から切り取りたいけれども、そこにIフレームがないために5秒後の193.652000秒の地点まで動画が真っ暗になる風情である。
そこで切り出し開始より手前のIフレームから切り出した動画に対して-g 1
オプションを付与して全フレームをIフレームと成せば自在に切り出せると思ったのであるけど、どうしても思惑通りにならない。動画ファイルもffmpegも奥が深いものである。
$ ffmpeg -i cut.mkv -g 1 iframe.mkv
nice post, thanks for this information. keep posting.