以前の記事
【ffmpeg】動画から特定フレームを画像で出力する方法 から発展して、ニコ生の映像に再生時間を載せつつ画像で出力することで内容が一目でわかり管理が楽になる方法。
この方法でメリットが有るのは映像に変化がある放送であり、画像1枚の放送では全くメリットがない。ゲーム実況やウェブカメラ配信、お絵かき放送など映像が刻々と変わる放送である。画像の出力には ffmpeg を使用する。
使用する ffmpeg :
Zeranoe FFmpeg - Buildsnamaroku や kakoroku に同梱されている ffmpeg でもよいが、64bit OS では1割程度速度が早くなるので64bit版の ffmpeg を利用する。
OS に合わせて Download FFmpeg git--***** 32-bit Static か Download FFmpeg git--***** 64-bit Static を保存する。解凍できない場合は
7-Zip などを使う。
基本コマンド
200秒毎に画像を 3x3 の1枚で出力する。1枠の場合9枚となり丁度1枚の画像に収まる
ffmpeg -i "nicolive_ts.flv" -vf "drawtext=fontfile='C\:/Windows/Fonts/msgothic.ttc': fontsize=16: fontcolor=yellow@0.9: shadowcolor=black@0.6: shadowx=-2: shadowy=-2: timecode='00\:00\:00\:00': r=24: x=10: y=10, select=isnan(prev_selected_t)+gte(t-prev_selected_t\,200), setpts=N/FRAME_RATE/TB, scale=1/2*iw:-1, tile=3x3" -an -y -vsync 0 img%02d.jpg
基本コマンドを元にそれぞれのオプションの説明
- -i "nicolive_ts.flv"
入力ファイル名。ffmpeg とは別の場所の場合は絶対パスか相対パスを指定する
- -vf "drawtext から tile=3x3" まで
映像にフィルタを当てて画像として出力する。以下で説明
- drawtext=fontfile=...: fontsize=16: ... x=10: y=10, まで
drawtext フィルタの指定方法。drawtext は文字を映像に載せるフィルタ。ここでは動画時間を表示させる。詳しい内容は以下で説明。普通に文字を表示させる方法は、Windows の ffmpeg で生放送する方法 : テキスト を参照
- fontfile='C\:/Windows/Fonts/msgothic.ttc'
フォントの指定で MSゴシックを使って文字を書く。このように絶対パスではなく、フォントファイルを ffmpeg と同じ所にコピーしても使える
- fontsize=16
フォントサイズの指定。規定値は 16 ピクセル
- fontcolor=yellow@0.9
フォントの色指定。@0.9 は透過指定で 1 が透過なし。0 で透明になる。規定値は黒の透過指定なし。
フォントの色は名前を直接指定する方法とカラーコードを指定する方法がある
HTML,CSS カラーコード一覧表 | 背景色や文字色の設定 を参照
fontcolor=yellow@0.9 と fontcolor=FFFF00@0.9 は同じ色になる
- shadowcolor=black@0.6
影付きの色指定と透過指定。影付きを指定しない場合は何も書かなくても良い。同様に透過も不要ならば書かなくても良い
- shadowx=-2: shadowy=-2
影をどの方向に付けるかの指定。x が横軸で + が右方向。y が縦軸で + が下方向。- はその逆になる
- timecode='00\:00\:00\:00'
時間表示方法。hh:mm:ss[;.:]ff (時間:分:秒:フレーム)形式になっている
'00\:00\:00\;00' と '00\:00\:00\.00' は同じ
'00\:00\:00\:00' は上と異なる
- r=24
フレームの1秒あたりの描写枚数。動画フレーム数と一致させないと上の timecode と実際の再生時間が一致しない。小数点や分数は指定できない
- x=10: y=10
timecode の描写座標。x=0: y=0 が左上隅で x が横軸で + が右方向。y が縦軸で + が下方向。- はその逆になる
- select=isnan(prev_selected_t)+gte(t-prev_selected_t\,200)
最後の 200 が重要で 200秒毎に画像を出力する。秒数を変更するときはこの値を変更する
詳しい仕様 : FFmpeg documentation : : 11.1 aselect, select
- scale=1/2*iw:-1
画像をリサイズする。リサイズしない場合は不要。この場合横幅を半分にしてアスペクト比を固定して縦幅もリサイズする。直接解像度を指定することもでき、 scale=320:180 は 320x180 にリサイズする
- tile=3x3
一枚画像に何枚の画像を貼り付けるかの設定。規定値は 8x8
貼り付けられる順番は左上から右下の順番
- -an
画像を出力するので音声を無効にする
- -y
同名のファイルが有るとアラートなしに上書きする
- -vsync 0
映像のズレが出ないようにするおまじない
- img%02d.jpg
img がファイル名の接頭詞になり、%02d が 00 から始まる連番。%03d であれば 000 から始まる連番。.jpg が出力形式。png や bmp でも可能
- 「:」「,」 の違い
フィルタを繋ぐ場合に使われ、「:」は同じフィルタに複数のオプションを指定する
「,」は異なるフィルタを指定する
秒数指定ではなく、映像がよく動いたシーン(Iframe)だけを出力する
select=isnan(prev_selected_t)+gte(t-prev_selected_t\,200) を
select=eq(pict_type\,I) に変更する。ただし出力画像枚数は増える。
コマンドを実行するには
cmd.zip を保存し ffmpeg と同じフォルダ内に解凍して、cmd を実行し、コマンドをコピペすればコマンドラインから ffmpeg を実行できる。
上のコマンドを実行すれば画像が出力されるが、どのように時間が表示されるか ffplay を使ってプレビューできる
基本コマンド
ffplay -f lavfi -i color=c=black:s=640x360:r=60 -vf "drawtext=fontfile='C\:/Windows/Fonts/msgothic.ttc': fontsize=64: fontcolor=white@0.9: shadowcolor=yellow@0.6: shadowx=-2: shadowy=-2: timecode='00\:00\:00\:00': r=60: x=10: y=10"
上のコマンドと違うところの説明
- -f lavfi -i color=c=black:s=640x360:r=60
背景となる映像の指定で、色(color=c)や解像度(s)、フレーム数(r)を指定する
- select=isnan(prev_selected_t)+gte(t-prev_selected_t\,200), scale=1/2*iw:-1, tile=3x3" 以下
これらを入力しないのは時間表示を進ませるためと、画像出力しないため
タイマーを動画として出力する
基本コマンド。読みやすいようにフォントサイズを大きくしている
ffmpeg -f lavfi -i color=c=black:s=640x360:r=60:d=20 -vf "drawtext=fontfile='C\:/Windows/Fonts/msgothic.ttc': fontsize=64: fontcolor=white@0.9: shadowcolor=yellow@0.6: shadowx=-2: shadowy=-2: timecode='00\:00\:00\:00': r=60: x=10: y=10" out.flv
d=20 は動画時間(秒)。
ffplay では機能しない高度な設定 < 共通設定 < 映像 < フィルタを有効にする
注意点は r を配信フレームレートと一致させる
コマンド例
drawtext=fontfile='C\:/Windows/Fonts/msgothic.ttc': fontsize=16: fontcolor=white@0.9: shadowcolor=yellow@0.6: shadowx=-2: shadowy=-2: timecode='00\:00\:00\:00': r=24: x=10: y=10
- 関連記事
-
コメント