ffprobe は動画ファイルについて詳しい情報を得ることができるソフトです。
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
で最後の一行、転じて最後のフレームだけ残す。
結局のところ動画の最初から情報をさらっているので実行速度的にはあまりよろしくありませんが、少なくとも扱いやすくはなります。