ffprobe でラスト1フレームの画像だけコマンドラインから取得する方法

 ffprobe は動画ファイルについて詳しい情報を得ることができるソフトです。

ffprobe Documentation

 ffprobe は次のコマンドで動画に含まれるフレームの情報を得られます。

> ffprobe --show_frames demo.mp4
# メタ情報省略
[FRAME]
media_type=video
stream_index=0
key_frame=1
pts=1502
pts_time=0.050067
pkt_dts=0
pkt_dts_time=0.000000
best_effort_timestamp=1502
best_effort_timestamp_time=0.050067
pkt_duration=1001
pkt_duration_time=0.033367
pkt_pos=80
pkt_size=305764
width=1920
height=1088
pix_fmt=yuv420p
sample_aspect_ratio=1:1
pict_type=I
coded_picture_number=0
display_picture_number=0
interlaced_frame=0
top_field_first=0
repeat_pict=0
color_range=unknown
color_space=unknown
color_primaries=unknown
color_transfer=unknown
chroma_location=left
[/FRAME]
[FRAME]
media_type=video
stream_index=0
key_frame=0
pts=8009
…以下同様に続く

 便利なのですが、場合によっては不要な情報も大量に流れてくるのが玉に瑕です。これを元に最後の1フレームの画像の情報だけ取得する方法を紹介します。

 コマンドは次です。

> ffprobe -hide_banner -show_frames -print_format csv ./demo.mp4 | grep video | tail -n 1

 これを実行すると次の様に最後の 1 フレームの画像の情報が CSV 形式で出力されます。もちろん上述の縦長の情報から情報が落ちていることもありません。

frame,video,0,0,313845,10.461500,310344,10.344800,313845,10.461500,500,0.016667,4826418,3107,1920,1088,yuv420p,1:1,P,131,0,0,0,0,unknown,unknown,unknown,unknown,left

 人間の目では扱い難いですが、プログラム的には扱いやすい形式です。このコマンドを解説すると次です。-hide_bannerでバージョン情報等の余分な情報を隠す。-show_framsでフレームの情報を出力する。-print_format csvで CSV 形式で出力する。| grep videoで ffprobe の出力結果行の内、画像の行だけ残す。| tail -n 1で最後の一行、転じて最後のフレームだけ残す。
 結局のところ動画の最初から情報をさらっているので実行速度的にはあまりよろしくありませんが、少なくとも扱いやすくはなります。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG