Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 310 articles
Browse latest View live

一番メジャーなインターレース解除フィルタ yadif

$
0
0

インターレース解除といえばとりあえずこのフィルタの名前が挙がるほど有名なフィルタ。yadif とは yet another deinterlacing filter。

基本コマンド

ffplay input -vf yadif:mode=0:parity=-1:deint=1
ffplay input -vf yadif=0:-1:1

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

オプション

  • mode
    モード指定
    規定値:0[int]
    • 0, send_frame
      2枚のフィールドから1枚のフレームを作る。規定値
    • 1, send_field
      1枚のフィールドから1枚のフレームを作る
      いわゆる片フィールド補間でフレーム数が2倍になる
    • 2, send_frame_nospatial
      0 に似ているが空間軸のチェックを行わない
    • 3, send_field_nospatial
      1 に似ているが空間軸のチェックを行わない
  • parity
    フィールドタイプを指定する
    自動で判断できなければ tff と判断する
    規定値:-1[int]
    • 0, tff
      トップフィールドファースト
    • 1, bff
      ボトムフィールドファースト
    • -1, auto
      自動指定。規定値
  • deint
    どのフレームを処理するか
    規定値:0[int]
    • 0, all
      すべて。規定値
    • 1, interlaced
      インターレースフラグがあるのだけ

インターレース解除フィルタ w3fdif

$
0
0

w3fdif とは BBC R&D の Martin Weston氏を元とし、BBC R&D の Jim Easterbrook氏がインターレース解除の機能を実装した片フィールド補間のインターレース解除フィルタである。w3fdif とは stands for “Weston 3 Field Deinterlacing Filter”。

基本コマンド

ffplay input -vf w3fdif:filter=1:deint=0
ffplay input -vf w3fdif=1:0

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

オプション

  • filter
    インターレースの係数指定
    規定値:1[int]
    • 0, simple
      単純。低負荷
    • 1, complex
      複雑。高負荷。規定値
  • deint
    どのフレームを処理するか
    規定値:0[int]
    • 0, all
      すべて。規定値
    • 1, interlaced
      インターレースフラグがあるのだけ

インターレースを解除する bwdif

$
0
0

bwdif(Bob Weaver Deinterlacing Filter)は yadif とキュービック補完アルゴリズムが使われている w3fdif を元とする動きに対応したインターレース解除フィルタである。

基本コマンド

ffplay input -vf bwdif=mode=0:parity=-1:deint=1
ffplay input -vf bwdif=0:-1:1

オプション

  • mode
    インターレースの種類
    • 0, send_frame
      2枚のフィールドから1枚のフレームを作る
    • 1, send_field
      1枚のフィールドから1枚のフレームを作る
      いわゆる片フィールド補間でフレーム数が2倍になる。規定値
  • parity
    トップボトムどちらが先かを指定する
    • 0, tff
      トップフィールドファースト
    • 1, bff
      ボトムフィールドファースト
    • -1, auto
      自動設定。規定値
  • deint
    どのフレームをインターレース解除するか
    • 0, all
      全てのフレーム
    • 1, interlaced
      インターレースフラグが立っているフレームだけ。規定値

テレシネ処理ができる telecine

$
0
0

テレシネしてフレーム数を増やすことができる telecine の使い方。日本で一般的なテレシネからヨーロッパ形式のテレシネまでいろいろなタイプを指定できる。

基本コマンド

インターレース具合がわかりやすいようにフレーム番号を振っている
ffplay -f lavfi -i color=white:s=200x200:r=24000/1001:d=10,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n\}':fontsize=64",telecine=pattern=23

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

オプション

  • first_field
    ファーストフィールドの指定
    規定値:0[boolean]
    • 0, top, t
      トップフィールドファースト。規定値
    • 1, bottom, b
      ボトムフィールドファースト
  • pattern
    プルダウンパターンの指定
    フィールド分解して同じフレームが連続するフィールドの数
    規定値:23
      NTSC output (30i)
    • 32222
      27.5p
    • 23
      24p、日本のテレビはこのタイプ、規定値
    • 2332
      24p
    • 33
      20p
    • 334
      18p
    • 3444
      16p
    • PAL output (25i)
    • 12222
      27.5p
    • 222222222223
      24p(“Euro pulldown”)
    • 33
      16.67p
    • 33333334
      16p

ffmpeg でのフレームレート設定の違い

$
0
0

ffmpeg にはフレームレートの設定方法がいくつかあるが、同じオプションでも指定場所では効果が違ったりするので一般的な用途のまとめ。オリジナルよりもフレームレートが少ないときは同じように間引かれるが、出力結果も一致するとは限らない。

  • 0番から249番までの250フレーム、25fps の基本動画
    ffmpeg -f lavfi -i testsrc=d=10,drawtext=fontfile="'C\:/Windows/Fonts/msgothic.ttc':text='%{n}':fontsize=30:x=W-tw:y=H-th" -vcodec utvideo input.mkv
  • フィルタとしての fps
    オリジナルよりフレームレートが少なければ間引く、多ければ重複フレームをつくる。動画時間は変わらない

    コマンド例
    ffmpeg -i input.mkv -vf fps=30 -vcodec utvideo output.mkv

  • フィルタとしての framerate
    オリジナルよりフレームレートが少なければ間引く、多ければ前後フレームを平均して増やす。動画時間は変わらない。YUV限定でRGB出力不可

    コマンド例
    ffmpeg -i input.mkv -vf framerate=30 -vcodec utvideo output.mkv

  • 入力オプションとしての r
    総フレーム数はそのままに1秒あたりのフレームレートを指定するので、オリジナルよりフレームレートが少なければ映像時間が長く、多ければ映像時間が短くなる

    コマンド例
    ffmpeg -r 30 -i input.mkv -vcodec utvideo output.mkv

  • 出力オプションとしての r
    オリジナルよりフレームレートが少なければ間引く、多ければオリジナルのまま。動画時間は変わらない

    コマンド例
    ffmpeg -i input.mkv -r 30 -vcodec utvideo output.mkv

  • dshow としての framerate
    DirectShow 入力での入力フレームレート。SCFF などの仮想デバイスのように任意に指定できる場合と、キャプチャカードやウェブカメラのように任意に指定できない場合がある

    コマンド例
    ffmpeg -rtbufsize 100MB -f dshow -framerate 30 -i video=device_name -vcodec utvideo output.mkv

高速で万能な逆テレシネフィルタ pullup

$
0
0

pullup は逆テレシネフィルタで、ハードテレシネや 24000/1001 fps プログレッシブや 30000/1001 fps プログレッシブの映像に対応している。未来フレームを参照するように設計されていてパターン周期が不定期でも正しく逆テレシネし、重複フレームは自動で間引く。片フィールド補間は行わないのでその部分の映像はなめらかにはならない。最後に出力フレームレートが偶数の時は、正しいフレームレートを指定する。

基本コマンド

日本で一般的な NTSC を 24000/1001 fps プログレッシブに変換する
ffplay -i input -vf pullup -r 24000/1001

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

オプション

変更できるオプションはいくつかあるが初期設定で重複フレームがなければ変更しない方が最善の結果になる。

  • jl
    左端を無視する設定。1ユニットあたり8ピクセル
    範囲:0 – int_max[int]
    規定値:1
  • jr
    右端を無視する設定。1ユニットあたり8ピクセル
    範囲:0 – int_max[int]
    規定値:1
  • jt
    上部を無視する設定。1ユニットあたり2ライン
    範囲:0 – int_max[int]
    規定値:4
  • jb
    下部を無視する設定。1ユニットあたり2ライン
    範囲:0 – int_max[int]
    規定値:4
  • sb
    処理の厳格さ
    1 は重複フレームを減らすが、あまり動いていない映像の場合に重複フレームと判断して間引くかもしれない
    -1 は処理を簡略がするがインターレースが残るかもしれない
    範囲:-1 – 1[int]
    規定値:0
  • mp
    メトリックチャンネルを指定する
    輝度差分が少ない映像の場合には u, v を指定するといいかもしれない
    範囲:0 – 2[int]
    規定値:0
    • 0, l
      輝度信号。規定値
    • 1, u
      青色成分の差分信号
    • 2, v
      赤色成分の差分信号

先鋭化やぼかし、エンボス処理などができる convolution

$
0
0

3×3 または 5×5 のカーネルが指定できる convolution の使い方。数学的な話やマトリクスはここでは説明しない。

基本コマンド

3×3 のカーネル。基本コマンドは何も変化しない
ffplay -i input -vf convolution="0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:0 0 0 0 1 0 0 0 0:1:1:1:1:0:0:0:0"

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

関連記事

オプション

カーネルが 3×3 または 5×5 で指定値の数が 9 または 25 と変わる。: で区切ってチャンネル毎に指定する。

  • 0m, 1m, 2m, 3m
    最初の指定値。チャンネル毎にカーネルを指定する。3×3 なら 9。5×5 なら 25 の値を指定する。基本的には YUV 映像なら YUVA の順番。RGB 映像なら GBRP にフォーマット変換して GBRA の順番になる
    3×3 の規定値:0 0 0 0 1 0 0 0 0
    5×5 の規定値:0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
  • 0rdiv, 1rdiv, 2rdiv, 3rdiv
    チャンネル毎の指定カーネルに倍率をかける
    規定値:1[float]
  • 0bias, 1bias, 2bias, 3bias
    チャンネル毎の指定カーネルに加算。明るくしたり暗くしたりするのに便利
    規定値:0[float]

コマンド例

  • 先鋭化
    ffplay -i input -vf convolution="0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0"
  • ボックスブラー
    ffplay -i input -vf convolution="1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9"
  • 5×5 ガウスブラー
    ffplay -i input -vf convolution="2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:2 4 5 4 2 4 9 12 9 4 5 12 15 12 5 4 9 12 9 4 2 4 5 4 2:1/159:1/159:1/159:0"
  • エッジ検出
    ffplay -i input -vf convolution="0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128"
    ffplay -i input -vf convolution="0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128"
  • エンボス
    ffplay -i input -vf convolution="-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2"
  • ソベル
    ffplay -i input -vf convolution="-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:-1 -2 -1 0 0 0 1 2 1:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:-1 0 1 -2 0 2 -1 0 1:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:3 10 3 0 0 0 -3 -10 -3:1:1:1:0:0:128:128:0"
    ffplay -i input -vf convolution="3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:3 0 -3 10 0 -10 3 0 -3:1:1:1:0:0:128:128:0"

詳細な分割設定ができる Segment

$
0
0

segment muxer とは時間やフレーム数指定でストリームを分割する。出力ファイル名には image2 muxer と同じように連番出力や、strftime オプションを使って日時設定もできる。正確にストリームを分割するにはキーフレームを分割毎の先頭に挿入しなければならない。キーフレームが先頭に来ないとキーフレームが来るまで映像が乱れる原因になる。hls muxer のオプションと併用することで詳細に分割設定ができる

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う
ffmpeg で指定秒ごとに分割する方法

基本コマンド

60秒ごとに .mp4 で分割して out.csv で分割データを記載したファイルも出力する
ffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 60 -segment_list out.csv out%03d.mp4

時間でキーフレームを指定しセグメントを分割して、キーフレーム時間を丸める
ffmpeg -i input.mp4 -force_key_frames 1,2,3,5,8,13,21 -map 0 -c:v libx264 -c:a aac -f segment -segment_time 60 -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 -segment_list out.csv out%03d.mp4

公式ドキュメント:FFmpeg Formats Documentation :: segment, stream_segment, ssegment

オプション

  • increment_tc 1|0
    各セグメント間のタイムコードを増やす
    規定値:0[boolean]
  • reference_stream specifier
    どのストリームを参照するか
    規定値:auto[string]
  • segment_format format
    セグメントのコンテナフォーマット指定
    規定値:出力コンテナフォーマットと同じ
  • segment_format_options options_list
  • segment_list name
    出力されるセグメントリストのファイル名の指定
    規定値:出力しない[string]
  • segment_list_flags flags
    • cache
      キャッシュを許可。M3U8 リストだけに反映(規定値)
    • live
      HLS 配信に有効
  • segment_list_size size
    リストに記載されるセグメント数。0 はすべて
    範囲:0 – INT_MAX[int]
  • segment_list_entry_prefix prefix
    リストの各セグメントに URL を付与する。各セグメントに絶対パスを指定するときに使う
    規定値:なし[string]
  • segment_list_type type
    セグメントリストのファイル形式の指定
    • flat
      普通のテキスト形式
    • csv
    • ext
    • ffconcat
    • m3u8
    • hls
  • segment_time time
    各セグメントの秒指定。キーフレームでないと指定した時間通りに分割されない
    規定値:2[string]
  • segment_atclocktime 1|0
    1 で 00:00 開始の時計の時間通りに分割する。segment_time で分割時間を指定する
    規定値:0[boolean]
  • segment_clocktime_offset duration
    segment_atclocktime を使ったときに分割時間を遅延させる。例えば -segment_time 900 -segment_clocktime_offset 300 を併用すると 600秒、1500秒、2400秒と900秒毎に分割される
    規定値:0[duration]
  • segment_clocktime_wrap_duration duration
    規定値:INT64_MAX[int]
  • segment_time_delta delta
    各セグメントの開始時間を決める時間(PTS)を特定する
    規定値:0[duration]
  • segment_times times
    , で区切って分割時間を指定する。3分より長いストリームを用いて 60,120,180 を指定すると、60, 60, 60, 残り時間全部で分割される
    規定値:0[string]
  • segment_frames frames
    , で区切って分割フレーム数を指定する。segment_times と同様に分割タイミングが来たときにキーフレームが来ていなければ次のキーフレームで分割する
    規定値:0[string]
  • segment_wrap limit
    セグメント数の上限を指定する。上限に達すると最初のセグメントから上書きするので容量の削減になる
    範囲:0 – INT_MAX[int]
    規定値:0
  • segment_start_number number
    セグメントの開始番号。開始番号を変更するのであり、映像の開始をずらすのではない
    範囲:0 – I64_MAX[int64]
    規定値:0
  • strftime 1|0
    各セグメント名に strftime を使う。1 にしたときは必ずセグメント名に strftime の書式を用いなければならない
    規定値:0[boolean]
  • break_non_keyframes 1|0
    1 にしたときにセグメントの開始にキーフレーム以外も含める。特定のプレイヤーで挙動がよくなるかもしれないが一般的にはよくならない
    規定値:0[boolean]
  • reset_timestamps 1|0
    タイムスタンプをリセットして各セグメントのタイムスタンプが 0 になる。hls など分割を前提に読み込む以外はリセットした方が分割後のファイルが扱いやすい
    規定値:0[boolean]
  • initial_offset offset
    タイムスタンプのオフセット秒指定
    規定値:0[duration]
  • write_empty_segments 1|0
    各セグメントで空データが出力された場合にそのまま出力するか
    規定値:0[boolean]

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

$
0
0

ffmpeg で Apple HTTP Live Streaming(通称、HLS)形式に出力する方法。各セグメントの動画ファイルは .ts でプレイリストとなるマニフェストは .m3u8 で出力される。また segment muxer のオプションを使うことでより詳細な設定ができる。

詳細な分割設定ができる Segment

基本コマンド

ffmpeg -i input output.m3u8

.mp4 を HLS にコーデックコピーする例
ffmpeg -i input.mp4 -bsf:v h264_mp4toannexb -c copy output.m3u8

.mp4 から暗号化とセグメントの時間指定(60秒)をする例(file.keyinfo は後述)
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_key_info_file file.keyinfo -hls_list_size 0 -hls_time 60 output.m3u8

公式ドキュメント:FFmpeg Formats Documentation :: hls

オプション

  • hls_time seconds
    各セグメントの秒
    範囲:0 – FLT_MAX[float]
    規定値:2
  • hls_list_size size
    マニフェストに記載されるセグメント数。0 はすべて
    範囲:0 – INT_MAX[int]
    規定値:5
  • hls_ts_options options_list
  • hls_vtt_options options_list
  • hls_subtitle_path path
    字幕ファイルのパス指定
    規定値:なし[string]
  • hls_wrap wrap
    セグメント数の上限を指定する。上限に達すると最初のセグメントから上書きするので容量の削減になる
    範囲:0 – INT_MAX[int]
    規定値:0
  • start_number number
    セグメントの開始番号。開始番号を変更するのであり、映像の開始をずらすのではない
    範囲:0 – I64_MAX[int64]
    規定値:0
  • hls_allow_cache allowcache
    キャッシュを許可するかどうかを明示的に指定する
    1 は許可する、0 は許可しない
    範囲:-1 – 1[int]
    規定値:-1
  • hls_base_url baseurl
    各セグメントに URL を付与する。各セグメントに絶対パスを指定するときに使う
    規定値:なし[string]
  • hls_segment_filename filename
    各セグメントのファイル名を指定する。マニフェスト出力の前に指定する。指定しなければマニフェストファイル名に連番が振られる。Windows 環境では drawtext の時と同じように %s が使えず、組み合わせによってもエラーになる
    Windows の ffmpeg で生放送する方法 : drawtext(テキスト描写)
    例:file%03d.ts(file000.ts, file001.ts, file002.ts, …)
    規定値:なし[string]
  • use_localtime
    セグメントのファイル名に strftime を割り当てる。hls_segment_filenameuse_localtime_mkdir で使う
    例:-use_localtime 1 -hls_segment_filename %Y%m%d.ts(20160420.ts)
    規定値:0[boolean]
  • use_localtime_mkdir
    セグメントの末端のディレクトリ指定に strftime を割り当てる。hls_segment_filename を併用する。ディレクトリがなければつくる
    例:-use_localtime 1 -use_localtime_mkdir 1 -hls_segment_filename “%Y%m%d/%Y%m%d.ts”(20160420/20160420.ts)
    規定値:0[boolean]
  • hls_key_info_file key_info_file
    セグメントの暗号化で使うファイルを指定する。key には 32バイトのバイナリを、IV には 16進数の文字列を指定する。書式は後述
    規定値:なし[string]
  • hls_flags
    • single_file
      1つだけのセグメントで出力
    • delete_segments
      マニフェストに記載されていないセグメントを順番に削除していく。hls_list_size 0 を併用すると効果が無い
    • round_durations
      マニフェストに記載されている1秒未満の時間を四捨五入する
    • discont_start
    • omit_endlist
      マニフェストの末端に追記される #EXT-X-ENDLIST を省略する
  • hls_playlist_type
    • event
      マニフェストに #EXT-X-PLAYLIST-TYPE:EVENT をつけ、hls_list_size 0 も強制される
    • vod
      マニフェストに #EXT-X-PLAYLIST-TYPE:VOD をつけ、hls_list_size 0 も強制される

hls_key_info_file の書式

書式

key URI
key file path
IV (optional)

http://server/file.key
/path/to/file.key
0123456789ABCDEF0123456789ABCDEF

file.key を openssl で作って暗号化するシェルスクリプト

#!/bin/sh
BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
ffmpeg -f lavfi -i testsrc -t 10 -c:v h264 -vf format=yuv420p -hls_key_info_file file.keyinfo output.m3u8

上のシェルスクリプトで作られる file.keyinfo の例

./file.key
file.key
ab160b11e8ec73708cfa8797d729c378

openssl で復号する例
openssl aes-128-cbc -d -in input.ts -out output.ts -K A4856CAC48F1E48D16688FEDE9925265 -iv 0123456789ABCDEF0123456789ABCDEF

concat を使い分ける

$
0
0

ffmpeg で映像や音声を連結(後ろにつなげる)する方法に concat があるが、concat にも3種類ありそれぞれ使い道が異なるのでそれらの説明。個別の記事は以前に書いているので補足説明を加えた。

filter : 【ffmpeg】動画・音声を連結する concat の使い方
protocol : 【ffmpeg】動画・音声を連結する concat の使い方 其の2
demuxer : 【ffmpeg】動画・音声を連結する concat の使い方 其の3

まずは連結するファイルのコーデックが同じで、かつ同じ解像度や fps、エンコード設定なら再エンコードしない demuxer, protocol の concat がおすすめ。demuxer, protocol の違いは demuxer のほうが新しい機能で対応コンテナが protocol より柔軟である。filter の concat はフィルタ経由で連結するので再エンコードされるが、リサイズやインターレース解除、デテレシネなどのフィルタを当てたりするのならこちらの方が連結部分がきれいに仕上がりやすい。

公式 wiki
Concatenate – FFmpeg

フィールドを足したり引いたりする tinterlace

$
0
0

入力した映像のフレームをフィールドに分離し足したり引いたりする tinterlace フィルタの使い方。1入力1出力なので別ソースの同じ映像を取り込む場合は偶数フレームと奇数フレームを interleave してから1映像にすることで2映像の偶数フィールドと奇数フィールドを混ぜることができる。

ちなみに偶数フレーム、奇数フレームそれぞれをドロップさせるフィルタに select があり、こちらの方が高速。

奇数を間引く:select=(mod(n\,2))
偶数を間引く:select=(mod(n-1\,2))

select の使い方:ffmpeg で重複フレームを間引く方法

説明で使われるフレーム、フィールド番号は 1 スタートの奇数である。

基本コマンド

1フレームをトップに2フレームをボトムに挿入する、縦幅が2倍、fpsが半分
ffplay -i input -vf tinterlace=0

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

オプション

文章で説明するよりも公式ドキュメントの図を見た方がわかりやすいので引用。

  • 0, mergex
    奇数フレームの偶数フィールドに次の偶数フレームを挿入する、縦幅が2倍になり、fps半分、既定値
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    
    Output:
    11111                               33333
    22222                               44444
    11111                               33333
    22222                               44444
    11111                               33333
    22222                               44444
    11111                               33333
    22222                               44444
  • 1, drop_even
    偶数フレームがドロップ、fps半分
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    
    Output:
    11111                               33333
    11111                               33333
    11111                               33333
    11111                               33333
  • 2, drop_odd
    奇数フレームがドロップ、fps半分
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    
    Output:
                        22222                               44444
                        22222                               44444
                        22222                               44444
                        22222                               44444
  • 3, pad
    奇数フレームの偶数フィールドに黒フィールドを差し替え、偶数フレームの奇数フィールドに黒フィールドを差し替え、縦幅が2倍になる
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    11111           22222           33333           44444
    
    Output:
    11111           .....               33333           .....
    .....               22222           .....               44444
    11111           .....               33333           .....
    .....               22222           .....               44444
    11111           .....               33333           .....
    .....               22222           .....               44444
    11111           .....               33333           .....
    .....               22222           .....               44444
  • 4, interleave_top
    奇数フレームの奇数フィールドと偶数フレームの偶数フィールドを合わせる、fps半分
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111<-       22222             33333<-        44444
    11111           22222<-         33333            44444<-
    11111<-       22222             33333<-        44444
    11111           22222<-         33333            44444<-
    
    Output:
    11111                                 33333
    22222                                 44444
    11111                                 33333
    22222                                 44444
  • 5, interleave_bottom
    奇数フレームの偶数フィールドと偶数フレームの奇数フィールドを合わせる、fps半分
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222<-         33333           44444<-
    11111<-       22222             33333<-         44444
    11111           22222<-         33333           44444<-
    11111<-       22222             33333<-         44444
    
    Output:
    22222                                 44444
    11111                                 33333
    22222                                 44444
    11111                                 33333
  • 6, interlacex2
    奇数フレームはオリジナルのフレーム順に、偶数フレームにその前の奇数フレームの偶数フィールドを差し替えてフレーム数を増やす、fps2倍
     ------> time
    Input:
    Frame 1            Frame 2            Frame 3             Frame 4
    
    11111              22222                33333               44444
     11111              22222                33333               44444
    11111              22222                33333               44444
     11111              22222                33333               44444
    
    Output:
    11111   22222   22222   33333   33333   44444   44444
     11111   11111   22222   22222   33333   33333   44444
    11111   22222   22222   33333   33333   44444   44444
     11111   11111   22222   22222   33333   33333   44444
  • 7, mergex2
    奇数フレームを奇数フィールドに偶数フレームを偶数フィールドに移動する、縦幅が2倍になる
     ------> time
    Input:
    Frame 1         Frame 2         Frame 3         Frame 4
    
    11111           22222            33333           44444
    11111           22222            33333           44444
    11111           22222            33333           44444
    11111           22222            33333           44444
    
    Output:
    11111           33333            33333           55555
    22222           22222            44444           44444
    11111           33333            33333           55555
    22222           22222            44444           44444
    11111           33333            33333           55555
    22222           22222            44444           44444
    11111           33333            33333           55555
    22222           22222            44444           44444

縦幅と fps の関係性

opt opt_name 縦幅 fps memo
0 merge 2x 1/2 weave
1 drop_even 1x 1/2
2 drop_odd 1x 1/2
3 pad 2x 1x 片フィールド
4 interleave_top 1x 1/2
5 interleave_bottom 1x 1/2
6 interlacex2 1x 2x
7 mergex2 2x 1x

ffmpeg で Twitter に投稿できる PNG に変換する

$
0
0

普通の PNG で投稿しても画質の悪い JPEG に変換されるのでこれを透過PNG で投稿することで PNG のまま投稿できる。

コマンド例

コマンドの説明
nullsrc:映像のテストソース。テストソースの中では一番負荷が軽い
scale2ref:映像フィルタ。2入力して、相手側の解像度に合わせることができる
lutrgb:映像フィルタ。特定のRGBに色を変更する
overlay:映像フィルタ。2映像を重ねる
alphamerge:映像フィルタ。2入力して、2入力のグレイスケール具合で1入力を透過させる
palettegen:映像フィルタ。最大256色のパレットを作る
paletteuse:映像フィルタ。パレットから元映像を減色する

24bit透過PNG
ffmpeg -i input -f lavfi -i nullsrc=d=1:s=1x1 -filter_complex [1:0]split[a][b];[a][0:0]scale2ref[a0][0];[a0]lutrgb=r=255:g=255:b=255[a1];[b]lutrgb=r=254:g=254:b=254[b0];[a1][b0]overlay=format=rgb[ab];[0][ab]alphamerge output.png
バッチファイル

8bit透過PNG(減色するので容量が減る)
ffmpeg -i input -filter_complex palettegen palette.png
ffmpeg -i input -i palette.png -filter_complex paletteuse 256colors.png
ffmpeg -i 256colors.png -f lavfi -i nullsrc=d=1:s=1x1 -filter_complex [1:0]split[a][b];[a][0:0]scale2ref[a0][0];[a0]lutrgb=r=255:g=255:b=255[a1];[b]lutrgb=r=254:g=254:b=254[b0];[a1][b0]overlay=format=rgb[ab];[0][ab]alphamerge output.png

バッチファイル

関連記事

比較する動画の解像度に合わせる scale2ref
Windows の ffmpeg で生放送する方法 : オーバーレイ
Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)
ffmpeg で 256色を最適化する

ffmpeg 3.1 リリース

$
0
0

追記 2016年7月3日
3.1 の4日後に 3.1.1 がリリースされた。
git.videolan.org Git – ffmpeg.git/shortlog

2016年6月27日、ffmpeg 3.1 Laplace(ラプラス)がリリースされた。3.1 は 3.0 からのメジャーアップデートでこれまでに取り込まれたコミットのすべてが入っている。

git.ffmpeg.org Git – ffmpeg.git/blob – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog
git.videolan.org Git – ffmpeg.git/blobdiff – Changelog(VideoToolbox H.264 encoder を入れ忘れている)

ここ最近のコミットでは新しいフィルタが今までほど追加されなくなっているが、その代わりにデコーダやエンコーダが多く追加されたバージョンアップである。

追加されたフィルタで記事にしているフィルタ一覧
手動でフィールド処理を行う fieldhint
インターレースを解除する bwdif
フィルタのベンチマークを調べることができる bench, abench
CIE 色度図を表示する ciescope

このバージョンに上がる前に bwdif の deint のオプションの初期値に変更がある。
インターレースを解除する bwdif
git.ffmpeg.org Git – ffmpeg.git/blobdiff – libavfilter/vf_bwdif.c

フィルタ以外注目点は、「VAAPI-accelerated H.264/HEVC/MJPEG encoding」、「DTS Express (LBR) decoder」、「Generic OpenMAX IL encoder with support for Raspberry Pi」、「CUDA CUVID H264/HEVC decoder」、「10-bit depth support in native utvideo decoder」、「libutvideo wrapper removed」、「VideoToolbox H.264 encoder」。

もう一つ忘れてたのが nvenc が nvEncodeApi.h の MIT ライセンス移行により一般に配布できるようになった。

ffmpeg に nvenc(cuda) をインストールする
configure: Don’t require nonfree for nvenc : git.videolan.org Git – ffmpeg.git/commitdiff

Windows バイナリを配布している Zeranoe FFmpeg – Builds は ffmpeg-20160525-git-9591ca7 以降のバイナリから利用できる。

VAAPI-accelerated は Linux 用のハードウェアエンコーダー。VideoToolbox は OS X 改め MacOS と iOS 向け。ハードウェアアクセレーション関係は公式の Wiki を参照。
HWAccelIntro – FFmpeg

ハードウェアエンコーダーは現物を持っていなく試せないので以下の記事を参照。
FFmpeg-users – H264 VAAPI Encoder | List View
FFmpeg-users – Raspberrypi h264_omx encoder pixel aspect ratio | List View

utvideo については –enable libutvideo が使えなくなっただけで、utvideo のエンコード、デコードはこれまでと同じようにできる。

追記 2016年7月3日
3.1.1 リリースと nvenc の記述を足した。

plane を入れ替え、コピーする shuffleplanes

$
0
0

plane(YUV や RGB の個別チャンネル)を入れ替えたり、コピーしたりできる shuffleplanes の使い方。

オプション

plane の順番は一般的には YUVA, RGBA の順番になっているが、このフィルタは RGB/A には対応していない。YUV420P の場合 Y と UV では解像度が違うので Y と UV を入れ替えるには YUV444P に変換する必要がある。

  • map0
    第1 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map1
    第2 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map2
    第3 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map3
    第4 plane の入出力を指定する。省略すると入力と同じ映像を返す

基本コマンド

U と V を入れ替える。いわゆる swapuv と同じ効果で負荷は同じ。
ffmpeg -i input -vf shuffleplanes=0:2:1:3 output
swapuv と同じ
ffmpeg -i input -vf swapuv output
輝度具合に応じて透過させる
ffmpeg -i input -vf format=yuva420p,shuffleplanes=0:1:2:0 -vcodec ffv1 output.mkv
透過情報を含んだファイルは yuva よりも rgba の方が扱いやすい
ffmpeg -i input -vf format=yuva420p,shuffleplanes=0:1:2:0,format=rgba -vcodec utvideo output.mkv

別ファイルの情報から元映像を透過させる alphamerge

$
0
0

alphamerge は2番目の入力のグレースケール(グレースケールでなければ変換される)の白黒具合に応じて1番目の入力に透過情報を加える。透過具合については黒が透過し、白に近いほど透過しなくなり、出力は YUVA または ARGB, RGBA になる。アルファチャンネルを含む映像になるのでそれに対応したコーデックで出力しないとアルファチャンネルが消えてしまうのに注意。YUVA なら ffv1。RGBA なら utvideo で出力する。同じ機能のフィルタに mergeplanes があるがこちらの方が負荷が少し軽い。

各映像チャンネルを結合する mergeplanes

基本コマンド

YUVA 出力の場合は ffv1
ffmpeg -i yuv -i gray -filter_complex alphamerge -vcodec ffv1 output.mkv
RGBA 出力の場合は utvideo
ffmpeg -i rgb -i gray -filter_complex alphamerge -vcodec utvideo output.mkv
mergeplanes を使う例
ffmpeg -i yuv -i gray -filter_complex mergeplanes=0x00010210:yuva420p -vcodec ffv1 output.mkv

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


アルファチャンネルをグレースケールで出力する alphaextract

$
0
0

映像にアルファチャンネルがあるときに alphaextract を使えばグレースケールで取り出すことができる。同時にフォーマットもグレースケールに変換される。同じ効果のフィルタに extractplanes=a があり、これもグレースケールで出力する。透過部分の値は小さく、透過しない部分の値は大きくなる。

各映像チャンネルを分離する extractplanes

基本コマンド

0000bf(青)の透過した部分を黒で、透過しない部分を白の alphaextract.png で出力する。設定するオプションはない。
ffmpeg -f lavfi -i smptebars=d=1 -vf colorkey=0x0000bf:.01:.1,alphaextract -vframes 1 alphaextract.png

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

ffmpeg でグレースケールを扱う

$
0
0

フィルタでグレースケールを扱うには大まかに YUV の Y を取り出す方法と、グレーにフォーマット変換する方法の2通りがある。前者は限定レンジになるので 16 から 235 の範囲に収まるが処理速度は速い。一方の後者はフォーマット変換を挟むので処理は遅いが 0 から 255 までのフルレンジを扱える。

extractplanes で YUV の Y を取り出す。この方法が一番高速でわかりやすい。
-vf extractplanes=y

次に彩度を 0 にする方法。
-vf hue=s=0

YUV の Y だけそのままに UV を 128 に変換する lutyuv
-vf lutyuv=val:128:128

グレーにフォーマット変換する方法
-vf format=gray

関連記事
各映像チャンネルを分離する extractplanes
Windows の ffmpeg で生放送する方法 : lutyuv

ffmpeg でエッジマスク

$
0
0

ffmpeg でエッジ検出するフィルタに edgedetectconvolution がある。これらのフィルタを使ってエッジ領域を拡大しグレースケールのマスクとすることでエッジ部分に特定のフィルタを当てないようにすることができる。

コマンド例

エッジ部分に hqdn3d を当てないようにマスクして、unsharp をかけるコマンド例。効果の具合を調べるには hqdn3d の代わりに noise=alls=80:allf=t+u を掛けるとエッジ部分にノイズが乗ってないのが分かる。
ffmpeg -i input -vf split=3[0][1][2];[0]hqdn3d[0a];[1]unsharp[1a];[2]convolution="0 0 0 -1 1 0 0 0 0",convolution="1 1 1 1 1 1 1 1 1",extractplanes=y,lutrgb=r="if(val\, if(gt(val\,25)\,255\)\,0)":g="if(val\, if(gt(val\,25)\,255\)\,0)":b="if(val\, if(gt(val\,25)\,255\)\,0)"[2a];[1a][2a]mergeplanes=0x00010210:yuva420p[12];[0a][12]overlay output
プレビューffplay -i input -vf split=3[0][1][2];[0]hqdn3d[0a];[1]unsharp[1a];[2]convolution="0 0 0 -1 1 0 0 0 0",convolution="1 1 1 1 1 1 1 1 1",extractplanes=y,lutrgb=r="if(val\, if(gt(val\,25)\,255\)\,0)":g="if(val\, if(gt(val\,25)\,255\)\,0)":b="if(val\, if(gt(val\,25)\,255\)\,0)"[2a];[1a][2a]mergeplanes=0x00010210:yuva420p[12];[0a][12]overlay

手順のかんたんな説明

  1. エッジ部分にフィルタを当てない映像と当てる映像、マスクを作る映像の3つに分ける(split=3
  2. エッジ部分にフィルタを当てない映像にデノイズ系のフィルタを当てる(hqdn3d
  3. エッジ部分にフィルタを当てる(つまりマスクしない)映像にアンシャープフィルタを当てる(unsharp
  4. マスクを作る映像にエッジ検出し領域を拡大する(convolution="0 0 0 -1 1 0 0 0 0",convolution="1 1 1 1 1 1 1 1 1"
  5. Y の情報だけを取り出す(extractplanes=y
  6. RGB で取り込んで各値の 25 以下の値を 0 に 26 以上の値を 255 に変更しマスクを調整する(lutrgb=r="if(val\, if(gt(val\,25)\,255\)\,0)":g="if(val\, if(gt(val\,25)\,255\)\,0)":b="if(val\, if(gt(val\,25)\,255\)\,0)")
  7. エッジ部分にフィルタを当てる映像にマスクする映像をアルファチャンネルとして取り込む(mergeplanes=0x00010210:yuva420p
  8. オーバーレイする(overlay

関連記事

手軽にモーションブラー atadenoise

$
0
0

各チャンネルの変化具合と平均化するフレーム数の指定により手軽にモーションブラーを当てることができる atadenoise フィルタの使い方。設定値を 0 にしてもすべてのチャンネルに影響を与えるので色味の変化が大きいと軽くフィルタを当てても変化が大きい。フレーム間で平均化するので3次元デノイズとも言える。

ffmpeg でモーションブラーを掛ける

基本コマンド

ffmpeg -i input -vf atadenoise=.02:.04:.02:.04:.02:.04:33 output
ffplay -i input -vf atadenoise=.02:.04:.02:.04:.02:.04:33

オプション

  • 閾値Aは急激な変化に反応するように設計され、閾値Bは連続的な変化に反応するように設計されている。
    • 0a[float]
      第1チャンネルの閾値Aの設定
      既定値:0.02
      範囲:0 から 0.3 まで
    • 0b[float]
      第1チャンネルの閾値Bの設定
      既定値:0.04
      範囲:0 から 5 まで
    • 1a[float]
      第2チャンネルの閾値Aの設定
      既定値:0.02
      範囲:0 から 0.3 まで
    • 1b[float]
      第2チャンネルの閾値Bの設定
      既定値:0.04
      範囲:0 から 5 まで
    • 2a[float]
      第3チャンネルの閾値Aの設定
      既定値:0.02
      範囲:0 から 0.3 まで
    • 2b[float]
      第3チャンネルの閾値Bの設定
      既定値:0.04
      範囲:0 から 5 まで
  • s[int]
    平均化するフレーム数。値が大きいほど残像感が出る。奇数でなければならない。
    既定値:33
    範囲:5 から 129 まで
  • 映像の黒枠の座標を検出する bbox

    $
    0
    0

    映像フレームの輝度チャンネルから黒枠を検出して黒枠以外の座標をコンソール上に表示する。cropdrawbox のコマンドも表示する。

    基本コマンド

    ffplay input -vf bbox=16
    出力例
    n:0 pts:0 pts_time:0 x1:0 x2:1279 y1:78 y2:641 w:1280 h:564 crop=1280:564:0:78 drawbox=0:78:1280:564
    公式ドキュメント:FFmpeg Filters Documentation : bbox

    オプション

    min_val[int]
    黒枠ではないと検出する輝度チャンネルの最小の値
    引数が一つしか無いのでそのまま数値指定してもよい
    既定値:16
    範囲:0 から 254 まで

    Viewing all 310 articles
    Browse latest View live


    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>