drawtext フィルタを使って時間とフレーム数を表示する方法。ただしこの方法は固定フレームでしか使えない。30000/1001 などの部分を動画のフレーム数で指定する。表示される内容は左から秒時間、hms時間、フレーム数、フレーム数を5で割った余り、ピクチャータイプ。

30000/1001 fps の動画
ffplay -i input -vf "drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{pts\:flt}-%{pts\:hms}-%{eif\:t*(30000/1001)\:d}-%{eif\:mod(t*(30000/1001),5)\:d}-%{pict_type}'"

24000/1001 fps の動画
ffplay -i input -vf "drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{pts\:flt}-%{pts\:hms}-%{eif\:t*(24000/1001)\:d}-%{eif\:mod(t*(24000/1001),5)\:d}-%{pict_type}'"

上のコマンドを使っても時間やフレーム数が正しく表示されない動画。時に .ts ファイルなどの場合、ずれる時間を先に調べ下のコマンドで再生する。
ffmpeg -i input.ts -copyts -vf "drawtext=fontsize=30:box=1:boxcolor=white:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{pts\:flt}-%{eif\:t*(30000/1001)\:d}-%{eif\:mod(t*(30000/1001),5)\:d}-%{pict_type}'" -vframes 1 output.jpg

画像に表示される秒時間を setpts フィルタに指定する。
ffplay -i input.ts -vf "setpts=PTS-秒時間/TB,drawtext=fontsize=30:box=1:boxcolor=white:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{pts\:hms}-%{eif\:t*(30000/1001)\:d}-%{eif\:mod(t*(30000/1001),5)\:d}-%{pict_type}'"

.ts ファイルのフレームを tile フィルタで前フレームを下に表示しながら確認する。適宜出力解像度を scale フィルタで指定する。
ffplay -i input.ts -vf "setpts=PTS-7276.221467/TB,drawtext=fontsize=130:box=1:boxcolor=white:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{pts\:hms}-%{eif\:t*(30000/1001)\:d}-%{eif\:mod(t*(30000/1001),5)\:d}-%{pict_type}',crop=iw:3*ih/4:0:0,split[a],tile=8x1:overlap=8,scale=1440:-1,[a]vstack"

調べたフレームから trim フィルタを使ってカットして連結するもできる。ただしこの方法だと音声はカットできないので atrim フィルタを使いフレーム数を pts 変換、またはサンプル数に変換する。さらに concat フィルタで連結する場合、動画時間が長くなるほど、カット数が多くなるほど時間がかかる。

参考記事
windows – Displaying the current frame of a video after skipping using drawtext/start_number not evaluation any variables – Stack Overflow

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)