特定の映像フレームや音声サンプルを出力する select, aselect

特定のフレーム間隔での出力なら trim. atrim フィルタでもよいが、select フィルタはピクチャータイプやインターレースタイプの指定でも出力できる。難点はものすごく処理が遅い。

trim フィルタの使い方

基本コマンド

select フィルタを使いながら音声も同期しつつ出力するのは難しいので音声は無効化 -an している。

0(最初)から100フレーム目までの合計101フレームを出力する。
ffmpeg -i input -vf select="between(n\,0\,100)",setpts=PTS-STARTPTS -vsync 0 -an output
同じ出力結果を trim フィルタで行う。こちらの方が処理が速い。
ffmpeg -i input -vf trim=start_frame=0:end_frame=101,setpts=PTS-STARTPTS -vsync 0 -an output

Continue reading “特定の映像フレームや音声サンプルを出力する select, aselect”

2018年4月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年4月のニコ生統計”

各フィールドをフレームに変換する separatefields

分離フィールドを交互に挟んだフレームにする separatefields フィルタ。フレーム数とフレームレートを2倍に、出力映像の縦解像度を半分にする。トップ、ボトムどちらのフィールドを先に出力するかは動画情報による。もし間違っているのなら setfield フィルタを先に指定する。

基本コマンド

ffmpeg -i input -vf separatefields output
ffplay -i input -vf separatefields

分離フィールドを元の映像に戻すには weave フィルタを使う。
ffmpeg -i input -vf separatefields,weave output
ffplay -i input -vf separatefields,weave

公式ドキュメント:FFmpeg Filters Documentation : separatefields

フィールドタイプのフラグを建てる setfield

インターレースの映像でトップとボトムのどちらが最初なのかを指定する setfield フィルタ。フィールドタイプが間違っているときに修正する。

基本コマンド

ffmpeg -i input -vf setfield=mode=auto output
ffplay -i input -vf setfield

公式ドキュメント:FFmpeg Filters Documentation : setfield

オプション

mode[int]
フィールドモードの指定

  • -1, auto
    入力と同じ。既定値
  • 0, bff
    ボトムフィールドファースト
  • 1, tff
    トップフィールドファースト
  • 2, prog
    プログレッシブ

簡易的なフレーム補間をする framerate

本格的なフレーム補間は minterpolate フィルタがあるが、framerate は前後フレームを平均化してフレーム補間を行う。

公式ドキュメント:FFmpeg Filters Documentation : framerate

基本コマンド

ffmpeg -i input -vf framerate=fps=50:interp_start=15:interp_end=240:scene=8.2:flags=scd output
ffplay -i input -vf framerate=50:15:240:8.2:scd

オプション

  • fps[int]
    出力フレームレート数の指定
    既定値:50
  • interp_start[int]
    線形補間される範囲の最初の値
    既定値:15
    範囲:0 から 255 まで
  • interp_end[int]
    線形補間される範囲の最後の値
    既定値:240
    範囲:0 から 255 まで
  • scene[double]
    シーンチェンジが検出されるレベルの指定。低い値だと補完しにくくなり、高い値だと補完しやすくなる
  • flags[flags]
    フラグの指定
    scene_change_detect, scd
    scene を使う。既定値

音声のダイナミックレンジを調べる drmeter

14以上ならレンジがとても広く、8 以上 14 未満 までは普通で、8 未満はレンジが狭いとされている。

基本コマンド

ffmpeg -i input -vn -af drmeter=length=3 -f null -

表示ログの例

[Parsed_drmeter_0 @ 0000000000486580] Channel 1: DR: 12.6
[Parsed_drmeter_0 @ 0000000000486580] Channel 2: DR: 12.9
[Parsed_drmeter_0 @ 0000000000486580] Overall DR: 12.7

公式ドキュメント:FFmpeg Filters Documentation : drmeter

オプション

length[double]
何秒単位で解析するかの設定
既定値:3
範囲:0.01 から 10 まで

可変フレームを検出する vfrdet

可変フレームか固定フレームかを調べることが出来る vfrdet フィルタ。コンソールには総フレーム数と可変フレーム数、 pts 間隔の最大値最小値が表示される。

基本コマンド

ffmpeg -i input -an -vf vfrdet -f null -

表示ログの例

固定フレームなら右に総フレーム数、左に可変フレーム数。

[Parsed_vfrdet_0 @ 000000000295fe80] VFR:0.000000 (0/34046)

可変フレームなら右に総フレーム数とは限らず、左に可変フレーム数かもよく分からない。pts 間隔の最大値最小値。

[Parsed_vfrdet_0 @ 00000000004e7f80] VFR:0.641629 (89787/50149) min: 0 max: 35)

公式ドキュメント:FFmpeg Filters Documentation : vfrdet

pts 間隔を調べるには ffprobe で調べる方法と、mkvtimestamp_v2 で調べる方法があるが、2つの方法が一致するとも限らない。

ffprobe
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time > pts_time.txt

mkvtimestamp_v2
ffmpeg -i input -an -f mkvtimestamp_v2 mkvtimestamp_v2.txt

ffprobe の使い方

動画や音声、画像ファイルを調べるのに ffmpeg で表示される以上のことを調べるときに使う ffprobe の使い方。grep, awk などから正規表現を使って必要なデータを取る方法もあるが、今回はそうでなくオプションを指定して必要なデータを表示する方法を紹介する。出力フォーマット指定ができるので json, xml からパースすれば正規表現で無理に取る必要はない。

ffprobe では vf, af, filter_complex が使えないので lavfi デバイスで読み込み、そこからフィルタを使う。よって映像は rawvideo、音声は pcm_f32le になるのに注意。

基本コマンド

オプションを何も付けなければ ffmpeg と同じ表示になる。
ffprobe -i input

コンテナストリームの情報を表示する。これが基本の出力内容になりこれから必要なものだけを出力したり、パケット単位で出力したりもできる。
ffprobe -i input -show_streams

ffmpeg などで表示される configure オプションやライブラリのバージョンは -hide_banner で非表示にできる。
ffprobe -hide_banner -i input -show_streams

ffprobe の内容だけが必要なら -v error を付ける。
ffprobe -v error -i input -show_streams

Json に出力する。
ffprobe -v error -i input -show_streams -of json > output.json

解像度を表示する。
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -i input

フレームレート、映像の開始時間、映像の時間を表示する。
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,start_time,duration -i input

パケット毎の pts_time,dts_time,size,flags(フレームタイプ, K_ がキーフレーム)を開始から10秒間 log.txt にリダイレクトさせる。
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time,dts_time,size,flags -read_intervals "%+10" > log.txt

pts_time と signalstats フィルタから YMIN を開始から1秒間 YMIN.txt にリダイレクトさせる。
ffprobe -v error -f lavfi -i movie=input.mp4,signalstats -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YMIN -read_intervals "%1" > YMIN.txt

lavfi デバイスで読み込む方法は movie, amovie 入力の設定内容 を参照。
packet_tags で使えるフィルタは meta | ニコラボ で検索。

16進数 ASCII のテキスト(show_data.txt)にリダイレクトする。コンソールにそのまま表示するとデータ量が多くおそらく固まるので必ずリダイレクトさせる。
ffprobe -v error -show_packets -show_data -i img > show_data.txt

公式ドキュメント : ffprobe Documentation
公式のWiki : FFprobeTips – FFmpeg

Continue reading “ffprobe の使い方”

ffmpeg 4.0 リリース

2018年4月20日に ffmpeg 4.0 Wu(Chien-Shiung Wu, 呉健雄) がリリースされた。今回のリリースはメジャーアップデートとなり、3.4 以降に追加された新機能の中からマスターにしか追加されていなかったフィルタやエンコーダ、デコーダ等の新機能が全て取り込まれた。今回は特にハードウェアアクセレーション関係のコミットが多い印象である。

前回記事
ffmpeg 3.4 リリース

RELEASE NOTES for FFmpeg 4.0 “Wu”

3.4 以降に取り込まれた機能の一覧
Changelog 3.4 to 4.0 < git.videolan.org Git

Continue reading “ffmpeg 4.0 リリース”

2018年3月のニコ生統計

集計期間は週間のニコ生統計の1ヶ月分である。2018年からカテゴリタグの割合は今までと変わらないが、1枠30分の割合が少なくなったので来場者数とコメント数の6000以上を除かないすべての放送を対象にした。それに伴い平均値は除外した。来場者数はTS視聴可能時間が来れば増え、TS来場者数を含まずに計算することは困難な仕様なので、翌日(当日)の朝に前日の6時から当日の6時までを取得している。

全放送を対象にしたので改めて以前の放送のデータを使って調べ直している。

Continue reading “2018年3月のニコ生統計”