月別アーカイブ: 2016年3月

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

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

関連記事
ffmpeg でインターレース解除

基本コマンド

日本で一般的な NTSC を 24000/1001 fps プログレッシブに変換する
2016年4月8日 ffplay は出力オプションに -r が使えなかったので直した
ffplay -i input -vf pullup,fps=24000/1001
ffmpeg -i input -vf pullup -r 24000/1001 output

公式ドキュメント:FFmpeg Filters Documentation : pullup
続きを読む 高速で万能な逆テレシネフィルタ pullup

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

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

  • 0番から249番までの250フレーム、25fps の基本動画(手軽)
    ffmpeg -f lavfi -i testsrc2=d=10 -vcodec utvideo input.mkv

  • 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

  • フィルタとしての minterpolate
    フレーム補間フィルタなのでオリジナルよりも多い値を指定する。補間方法は平均と予測がある。ffmpeg でフレーム補間する minterpolate

    コマンド例(予測なのでかなり遅い)
    ffmpeg -i input.mkv -vf minterpolate=50 -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

  • 連番画像を入力するときのフレームレートを決める framerate
    連番画像を入力するときのフレームレートは r ではなくて framerate を使う方がより正確であり、公式ドキュメントを見ても設定項目に書いてある。

    コマンド例
    ffmpeg -framerate 30 -i img%03d.png out.mkv

    参考記事:【ffmpeg】動画から特定フレームを画像で出力する方法

テレシネ処理ができる telecine

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

関連記事
ffmpeg でインターレース解除

基本コマンド

インターレース具合がわかりやすいようにフレーム番号を振っている
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
続きを読む テレシネ処理ができる telecine

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

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

修正 2016年6月27日
deint オプションの初期値が最初のコミットからメジャーアップデートの 3.1 に変わるときに 0, all に変更。

関連記事
ffmpeg でインターレース解除

基本コマンド

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

オプション

  • mode
    インターレースの種類

    • 0, send_frame
      2枚のフィールドから1枚のフレームを作る
    • 1, send_field
      1枚のフィールドから1枚のフレームを作る
      いわゆる片フィールド補間でフレーム数が2倍になる。既定値
  • parity
    トップボトムどちらが先かを指定する

    • 0, tff
      トップフィールドファースト
    • 1, bff
      ボトムフィールドファースト
    • -1, auto
      自動設定。既定値
  • deint
    どのフレームをインターレース解除するか

    • 0, all
      全てのフレーム。既定値
    • 1, interlaced
      インターレースフラグが立っているフレームだけ

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

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

関連記事
ffmpeg でインターレース解除

基本コマンド

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
      インターレースフラグがあるのだけ

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

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

関連記事
ffmpeg でインターレース解除

基本コマンド

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

公式ドキュメント:FFmpeg Filters Documentation : yadif
続きを読む 一番メジャーなインターレース解除フィルタ yadif

手動でフィールド処理を行う fieldhint

フィールドオーダーが予め分かっている場合に、テキストファイルに正しいフィールドオーダーを記載することでどのインターレス解除フィルタよりも高速にプログレッシブ化できる fieldhint の使い方。いわゆる手動インターレース解除フィルタである。間引くフレームも分かるので decimate ではなく trim を使うことでより正確に処理ができる。フィールドを選択できるのが fieldhint でフレームを選択するのが select。固定周期なら一度の指定で済むが途中で周期が変わると ffmpeg だけでは場所の特定が難しい。

関連記事
ffmpeg でインターレース解除

基本コマンド

単純なプログレッシブ化
ffmpeg -i input -vf fieldhint=hint.txt:relative output
ffmpeg -i input -vf fieldhint=hint.txt:1 output
ffplay -i input -vf fieldhint=hint.txt:1

ntsc 29.976 フレームの動画を trim を併用して5フレーム中2フレーム目を間引く例(n は 0 スタート)。trim で間引く場合は fps で正しいフレームレートを指定しないと再び重複フレームが作られる
ffmpeg -i input -vf fieldhint=hint.txt:relative,select=(mod(n-1\,5)),fps=24000/1001 output

trim フィルタの使い方
ffmpeg で使える計算書式

公式ドキュメント:FFmpeg Filters Documentation : fieldhint
続きを読む 手動でフィールド処理を行う fieldhint

CIE 色度図を表示する ciescope

CIE 色度図を表示する ciescope の使い方。出力フォーマットは rgba64le なので余白部分をオーバーレイで透過できる。

基本コマンド

ffplay input -vf ciescope=system=0:cie=0:gamuts=ntsc:s=512:i=.001:contrast=.75:corrgamma=1:showwhite=0:gamma=2.6
ffplay input -vf ciescope=0:0:ntsc:512:.001:.75:1:0:2.6

ciescope のサンプル画像


公式ドキュメント:FFmpeg Filters Documentation : ciescope
続きを読む CIE 色度図を表示する ciescope

フィルタのベンチマークを調べることができる bench, abench

平均負荷と最大負荷、最小負荷を調べることができる。

基本コマンド

縦横半分に scale でリサイズしたベンチマーク
ffplay input -vf bench=start,scale=iw/2:-1,bench=stop

compand のベンチマーク
ffplay input -af abench=start,compand,abench=stop
Windows の ffmpeg で生放送する方法 : compand

公式ドキュメント:FFmpeg Filters Documentation : bench, abench
続きを読む フィルタのベンチマークを調べることができる bench, abench