ニコ生のTSからサムネイルを出力する

ニコ生のTSの映像を一定時間ごとにサムネイルで出力する ffmpeg のコマンドとバッチファイルの公開。
ffmpeg は kakoroku に同梱してあるのを使い、バッチファイルを ffmpeg と同じ場所に置く。サムネイルはTSファイルと同じ場所に出力される。1枚ずつ個別に画像を出力する場合は tile=3x3 を外す。

1フレームに複数のフレームを表示する tile
【ffmpeg】動画から特定フレームを画像で出力する方法

高速で正確


高速処理でかつ切り取る時間も正確である。切り取る時間の指定は分母に指定し、分子は 1 を指定する。つまり 1/1 = 1 なら1秒ごと、1/10 なら10秒ごとになる。最後のフレームが指定秒で割り切れなくても1番最後の画像で出力される。

ffmpeg -analyzeduration 30M -probesize 30M -i %1 -vf "fps=fps=1/200:round=down,tile=3x3,scale=iw/3:-2" -an -vsync 0 %04d.jpg

高速だが不正確


高速処理だが、正確な時間通りにとは限らず、映像によってはサムネイルを出力しないことも多い。-ss で出力する秒を個別に指定し 3x3 の9分割のサムネイルが出力される。30分の動画を基本としているのでそれ以外の時間は別途 -ss の秒を書き換える。

stack を使う場合
ffmpeg -analyzeduration 30M -probesize 30M -ss 200 -i %1 -ss 400 -i %1 -ss 600 -i %1 -ss 800 -i %1 -ss 1000 -i %1 -ss 1200 -i %1 -ss 1400 -i %1 -ss 1600 -i %1 -ss 1796 -i %1 -filter_complex [0:0][1:0][2:0]hstack=3[012],[3:0][4:0][5:0]hstack=3[345],[6:0][7:0][8:0]hstack=3[678],[012][345][678]vstack=3,format=rgb24 -vframes 1 -an %04d.png

overlay を使う場合。こちらの方が遅い
ffmpeg -analyzeduration 30M -probesize 30M -ss 200 -i %1 -ss 400 -i %1 -ss 600 -i %1 -ss 800 -i %1 -ss 1000 -i %1 -ss 1200 -i %1 -ss 1400 -i %1 -ss 1600 -i %1 -ss 1796 -i %1 -filter_complex "[0:0]split[01][02],[01]scale=iw/3:ih/3[a],[1:0]scale=iw/3:ih/3[b],[2:0]scale=iw/3:ih/3[c],[3:0]scale=iw/3:ih/3[d],[4:0]scale=iw/3:ih/3[e],[5:0]scale=iw/3:ih/3[f],[6:0]scale=iw/3:ih/3[g],[7:0]scale=iw/3:ih/3[h],[8:0]scale=iw/3:ih/3[i],[02][a]overlay[a1],[a1][b]overlay=W-2*w:0[b1],[b1][c]overlay=W-w:0[c1],[c1][d]overlay=0:H-2*h[d1],[d1][e]overlay=W-2*w:H-2*h[e1],[e1][f]overlay=W-w:H-2*h[f1],[f1][g]overlay=0:H-h[g1],[g1][h]overlay=W-2*w:H-h[h1],[h1][i]overlay=W-w:H-h:format=rgb" -vsync 0 -an %04d.png

そこそこ速い


上のコマンドでサムネイルがうまく出力できない場合はこちらのコマンドを用いる。

ffmpeg -analyzeduration 30M -probesize 30M -i %1 -vf "framestep=1200,tile=3x3,scale=iw/3:-2" -an -vsync 0 %04d.jpg

framestep フィルタで指定フレーム数毎に出力するので予め動画のフレーム数を調べておく必要がある。MPC-HC の場合は 表示 < 統計 で画面下に表示される。

追記 2015/01/07
thumbnail から framestep に変更。

とても遅い


さらにより正確に出力したい場合は select フィルタを使うがとても遅くPC負荷が高いのに注意。gte(t-prev_selected_t\,200)200の値が200秒毎にサムネイルを出力する。長時間の動画でこのコマンドを使うのは非推奨。

ffmpeg -analyzeduration 30M -probesize 30M -skip_frame noref -i %1 -vf "select=isnan(prev_selected_t)+gte(t-prev_selected_t\,200),setpts=N/FRAME_RATE/TB,tile=3x3,scale=iw/3:ih/3" -an -vsync 0 -frame_pts true %04d.jpg
関連記事

コメント

非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

当ブログは、Amazonアソシエイトに参加しています。