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

H.264/AVC でシークしやすい中間出力ファイルに変換する

$
0
0

適宜音声フォーマットでコピーできない場合はそれに変える。
-qp 0 は可逆圧縮、-g 1 は全フレームが I-frame になりシークバーが動かしやすくなる。

出力は YUV444
ffmpeg -i input -vcodec libx264 -qp 0 -g 1 -tune fastdecode -acodec copy output.mp4

RGB 出力の場合
ffmpeg -i input -vcodec libx264rgb -qp 0 -g 1 -tune fastdecode -acodec copy output.mp4


ffmpeg でインターレース解除

$
0
0

ffmpeg でインタレ解除をするにはいくつかの方法があるので目的に合わせてインタレを解除する。

  • とにかく高速でインタレ解除して 24fps化したい(重複フレームは多少ある)
    pullup,fps=24000/1001
  • 一般的な使い方ならこれで十分の 24fps化(重複フレームはあまりない)
    yadif=0:-1:1,decimate
  • スクロールが多い場合はこちらの方がいいかもしれない 24fps化
    yadif,decimate
  • yadif ではなく IVTC を使って 24fps化
    fieldmatch=order=tff:combmatch=none,decimate
  • IVTC と yadif を併用して 24fps化(かなり遅い)
    fieldmatch=order=tff:combmatch=full,yadif,decimate
  • NTSC に 60i が混在している場合
    w3fdif

公式ドキュメント

ロゴ消しはこちら:ffmpeg できれいにロゴを消す方法

映像と音声を逆再生にエンコードする

$
0
0

reverse を使って逆再生にエンコードする。ただし音声の逆再生は未対応なので別のアプリケーションを使う必要がある。trim 必須なので予めカットしておいた方が処理速度は速い。

2015年7月24日音声の逆再生フィルタも追加された
avfilter: add areverse filter :: git.videolan.org Git – ffmpeg.git/commitdiff

reverse は最近追加されたフィルタなので最新Git を利用する。
avfilter: Add reverse filter :: git.videolan.org Git – ffmpeg.git/commitdiff

trim フィルタの使い方

基本コマンド

開始10秒から20秒までを取り込んで20秒から10秒にする
ffmpeg -i input -vf trim=10:20,reverse -an output

開始10秒から20秒までを取り込んで20秒から10秒にする(音声を含む)
ffmpeg -i input -filter_complex trim=10:20,reverse;atrim=10:20,areverse output

複数の時点を逆再生してつなげる場合は concat でつなげる後ろの PTS を 0 に変える。秒数で指定するとつなぎ目でシーンが重複するので映像ならフレーム単位、音声ならサンプリング単位でつなげるときれいにつながる。

30秒から 10秒まで
ffmpeg -i input -vf split[a][b];[a]trim=10:20,setpts=PTS-STARTPTS,reverse[a1];[b]trim=20:30,reverse[b1];[b1][a1]concat=2:1:0 -an output

30秒から 10秒まで(音声を含む)
ffmpeg -i input -filter_complex split[a][b];[a]trim=10:20,setpts=PTS-STARTPTS,reverse[a1];[b]trim=20:30,reverse[b1];asplit[c0][d];[c0]atrim=10:20,asetpts=PTS-STARTPTS,areverse[c1];[d]atrim=20:30,areverse[d1];[b1][d1][a1][c1]concat=2:1:1 output

20秒から 10秒まで、30秒から 20秒まで
ffmpeg -i input -vf split[a][b];[a]trim=10:20,reverse[a1];[b]trim=20:30,setpts=PTS-STARTPTS,reverse[b1];[a1][b1]concat=2:1:0 -an output

20秒から 10秒まで、30秒から 20秒まで(音声を含む)
ffmpeg -i input -filter_complex split[a][b];[a]trim=10:20,setpts=PTS-STARTPTS,reverse[a1];[b]trim=20:30,reverse[b1];asplit[c0][d];[c0]atrim=10:20,asetpts=PTS-STARTPTS,areverse[c1];[d]atrim=20:30,areverse[d1];[b1][d1][a1][c1]concat=2:1:1 output

【ffmpeg】動画・音声を連結する concat の使い方

公式ドキュメント

ffmpeg で聞き取りやすい音量に変える

$
0
0

大きすぎる音は小さく、小さい音は大きく聞き取りやすい音量に変える音量ノーマライザフィルタ。雑談などの声中心なら聞こえやすくなるので効果的で、急に音量が変わって聞き取りにくい音声を修正するのにも使える。

音量を調べるには showwavespicebur128volumedetect などがある。

サンプリング周波数を一枚画像で出力する showwavespic
適切な音量が調べられる ffmpeg の ebur128 の使い方

volumedetect の使い方
ffmpeg -i input -vn -af volumedetect -f null -

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

オプション

オプションの詳細は公式ドキュメントを参照。

  • f
    ミリ秒当たりのフレームの長さ。10 から 8000 まで
    規定値:500
  • g
    ガウスフィルタの適応幅。3 から 301 までの奇数
    規定値:31
  • p
    ピーク音量の設定。
    規定値:.095(変えるのは非推奨)
  • m
    最大ゲインの設定。1.0 から 100.0 まで
    規定値:10.0
  • r
    目標RMS(二乗平均平方根) の設定。0.0 から 1.0 まで
    規定値:0.0
  • n
    それぞれのチャンネルに同様のフィルタを当てる。
    規定値:1
  • c
    DCバイアス補正。
    規定値:0
  • b
    別の境界補正の設定。
    規定値:0
  • s
    古典的な圧縮方法を使う。0.0 から 30.0 まで
    規定値:0.0

基本コマンド

ffmpeg -i input -af dynaudnorm output

差分を手軽に調べるには showwavespic を使う
ffmpeg input -vn -filter_complex dynaudnorm,showwavespic dynaudnorm.png
ffmpeg input -vn -filter_complex showwavespic non-dynaudnorm.png

ffmpeg で後ろから読み込みが可能に

$
0
0

通常読込時点の指定には -ss で最初からの経過秒を指定していたが、これからは最後からの秒を指定できるようになった。2015年7月30日のコミットなので最新のGit から利用する。

対象コミット:ffmpeg: Implement support for seeking relative to EOF :: git.videolan.org Git – ffmpeg.git/commitdiff

公式ドキュメント:ffmpeg Documentation :: Main options

使い方

-sseof でマイナス時間を指定する。書式は hh:mm:ss[.xxx], ss[.xxx] 規定値では最後から指定時間だけ出力される。
ffmpeg -sseof -<seconds> -i input output

-t も併用することで時間の調整も出来る。
ffmpeg -sseof -<seconds> -i input -t <seconds> output

入力した2つの音声にクロスフェードをかける acrossfade の使い方

$
0
0

1入力の最後の音量を絞りながら2入力の音量を徐々に上げてつなげるフィルタ。単純に音声ファイルをつなげるのなら concat を使う。

【ffmpeg】動画・音声を連結する concat の使い方

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

オプション

  • nb_samples, ns
    フェード部分のサンプリング周波数の指定。規定値:44100
  • duration, d
    前後それぞれのフェード時間。規定値は nb_samples だけ。つまり1入力の1秒分
  • overlap, o
    フェード部分を重ねるかどうか。規定値:1
  • curve1, c1
    1入力のフェードアウトの仕方の指定。
  • curve2, c2
    2入力のフェードインの仕方の指定。c1 と同様に afade の curve のオプションが使える
    FFmpeg Filters Documentation :: afade

基本コマンド

ffmpeg -i input1 -i input2 -filter_complex acrossfade output.wav

ニコ生で使うデノイズフィルタの例

$
0
0

一般的に配信用途でのデノイズには hqdn3d だけが使われているが、個別のコンシューマゲームとして一番配信されている Splatoon を ffmpeg で配信するときに 384kbps の時間帯ではどうしても画質が維持できない。そこでもう一つデノイズフィルタを加えることで全体の画質を向上させてみた。

使うのは pp フィルタで随分前からブログで紹介していたが、配信向きではないと書いていたので使われることがなかった。しかし色々調べてみると見た目の画質は維持しながら 3D特有のテクスチャーを hqdn3d 以上にぼかすことが出来るので、複雑な部分をぼかしながら他の場所にビットレートを割ることで全体的に見栄えのよい映像にすることが出来る。

Windows の ffmpeg で生放送する方法 : pp

サンプル動画は 神連携(野良試合)40秒で終わるガチマッチ(sm26969815) でフィルタ毎に比較する。オリジナルの解像度は 1280×720 なのでリサイズしてからフィルタを当てる。ffmpeg から画像を取り出すと RGB 変換で色が劣化するので AviUtl で静止画をクリップボードで取得して PictBear で補正処理を行って 512×288 にリサイズした。

静止画だとフィルタの効果しか分からないが、実際のニコ生の配信にはビットレート制限があるので制限に応じてどこまで細部を描写できるかでフィルタの強度を上げ下げするとよい。例では第1引数(difference)を上げ下げしてデノイズの指定場所を変えていたが、第2引数(flatness)と fq の値を変えることで強度を変更できる。flatness の下げすぎに注意。

オリジナルその1(323KB)


以下フィルタ別のファイルはリンク(遠くの背景がよくぼけている)
unsharp=3:3:0.5:3:3:0.5(292KB)
hqdn3d,unsharp=3:3:0.5:3:3:0.5(293KB)
pp=hb|4|39/vb|4|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(292KB)
pp=hb|4|36/vb|4|36/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(291KB)
pp=hb|8|39/vb|8|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(290KB)
pp=hb|32|39/vb|32|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(290KB)
pp=hb|64|39/vb|64|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(287KB)

オリジナルその2(323KB)


以下フィルタ別のファイルはリンク(左のイカリや地面がぼけている)
unsharp=3:3:0.5:3:3:0.5(257KB)
hqdn3d,unsharp=3:3:0.5:3:3:0.5(254KB)
pp=hb|4|39/vb|4|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(252KB)
pp=hb|4|36/vb|4|36/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(252KB)
pp=hb|8|39/vb|8|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(251KB)
pp=hb|32|39/vb|32|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(244KB)
pp=hb|64|39/vb|64|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(245KB)

オリジナルその3(334KB)


以下フィルタ別のファイルはリンク(壁と地面がよくぼけている)
unsharp=3:3:0.5:3:3:0.5(277KB)
hqdn3d,unsharp=3:3:0.5:3:3:0.5(275KB)
pp=hb|4|39/vb|4|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(272KB)
pp=hb|4|36/vb|4|36/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(270KB)
pp=hb|8|39/vb|8|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(267KB)
pp=hb|32|39/vb|32|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(262KB)
pp=hb|64|39/vb|64|39/dr/fq|32,hqdn3d,unsharp=3:3:0.5:3:3:0.5(262KB)

比較する動画の解像度に合わせる scale2ref

$
0
0

1入力した映像を2入力の解像度にリサイズする scale2ref の使い方。
主な用途は異なる解像度の動画をフィルタ内で比較、参照したりするときに、参照動画の解像度は scale では取得できないので その代わりに scale2ref を使うことになる。使えるオプションは scale と同じ。

基本コマンド

input1:640×360, input2:1280×720
input1 の解像度は 1280×720 にリサイズされ、input2 はそのまま
ffmpeg -i input1 -i input2 -filter_complex scale2ref[a][b] -map [a] output1 -map [b] output2

input1 の解像度は input2 の4分の1にリサイズされ、input2 はそのまま
ffmpeg -i input1 -i input2 -filter_complex scale2ref=1/4*iw:1/4*ih[a][b] -map [a] output1 -map [b] output2

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


2つの映像の画質評価をする SSIM

$
0
0

2入力した映像を比較してオリジナルにどれだけ忠実であるか SSIM の値を計算する。主な用途はエンコード前後を比較してどれだけ劣化したのか、特定のフレームを抽出してエンコードを見直したりする。libx264 エンコードでリアルタイムで計測する場合はオプションの -tune ssim -ssim 1 を使う。

Windows の ffmpeg で生放送する方法 : エンコードのログ出力の方法

最終結果だけを表示
ffmpeg -i input1 -i input2 -filter_complex ssim -an -f null -

ログファイルを出力する
ffmpeg -i input1 -i input2 -filter_complex ssim=stats.txt -an -f null -

ログファイルの見方

  • n
    フレーム番号
  • Y, U, V, R, G, B
    コンポーネント別の SSIM。1 に近いほど忠実
  • All
    全体の SSIM
  • dB
    dB での値。大きいほど高画質

似た指標に PSNR もあるが主観的な画質の比較なら SSIM のほうがよい。

http://www.jiima.or.jp/pdf/5_JIIMA_guideline.pdf より

PSNR SSIM 主観評価
40~∞[dB] 0.98以上 元の画像と圧縮画像の区別がつかない
30~40[dB] 0.90~0.98 拡大すれば劣化がわかるレベル
30以下[dB] 0.90以下 明らかに劣化がわかる

x264におけるSSIMの目安
http://www.wikihouse.com/htumenc/index.php?SSIM より

SSIM値 qp設定値(例)
0.98 以上 20 オリジナルと区別がつかない。
0.95 30 見るに耐えない。(*または辛うじて、そこそこ見られる*)
0.9 40 非常に醜い。
0.8 51 これ以上は圧縮できない
0.7 以下 素材に大量のノイズを加え、さらにそのノイズを量子化工程で消し去るほどqpを高くしない限り、達成困難。

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

ffmpeg 2.8 の気になる新機能とは

$
0
0

ffmpeg 2.8 が2015年9月9日リリースされた。それに伴い ffmpeg 2.7 から新たに追加されたフィルタやエンコーダーやデコーダーなど気になる新機能についてのまとめ。

チェンジログ:git.videolan.org Git – ffmpeg.git/blob – Changelog

広く恩恵を受けるのは「Intel QSV-accelerated MPEG-2 video」の部分で MPEG-2 video を libx264 でエンコードしている人にはエンコード速度の向上が図れる。ただしこれが有効になっている Windows バイナリが一般公開されていないので Master of the Dark Arts-ニコニコミュニティ で配布している Full-Auto-modified-v2 を使うと手軽に Windows用の ffmpeg を作ることが出来る。

qsv 対応の ffmpeg をつくる

2.7 から新たに追加されたフィルタの気になる部分については随時ブログで更新していたので該当記事を参照。

更新予定のフィルタ

  • aphasemeter filter
  • showfreqs filter
  • adrawgraph audio and drawgraph video filter
  • erosion, dilation, deflate and inflate video filters
  • vectorscope filter
  • waveform filter

音声を位相メーターの映像に変換する aphasemeter

$
0
0

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

オプション

  • rate, r
    フレームレート指定。規定値:25
  • size, s
    解像度指定。規定値:800×400
  • rc
    位相のR色指定。規定値:2
  • gb
    位相のG色指定。規定値:7
  • bc
    位相のB色指定。規定値:1
  • mpc
    中央値に色をつける。規定値:none
aphasemeter の表示例


基本コマンド

ffplay -f lavfi -i "amovie=input,aphasemeter=25:800x400:2:7:1:none"

基本は上から下に流れるので、rotate を使って右から左に流すコマンド
ffplay -f lavfi -i "amovie=input,aphasemeter=25:800x800:2:7:1:yellow,rotate=90*PI/180"

FFmpeg Filters Documentation :: rotate

関連フィルタ

YUV、彩度、色相 を見える化する signalstats

$
0
0

数値化した YUV、彩度、色相 のデータを映像にオーバーレイしたり、コンソールに表示したり出来る。映像の表示方法はグラフで表示する方法と、映像に数値をオーバーレイする方法の2通りがある。

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

続きを読む

オプション

  • YMIN
    該当フレームの Y の最小値。0 から 255 まで
  • YLOW
    該当フレームの Y の10%の値。0 から 255 まで
  • YAVG
    該当フレームの Y の平均値。0 から 255 まで
  • YHIGH
    該当フレームの Y の90%の値。0 から 255 まで
  • YMAX
    該当フレームの Y の最大値。0 から 255 まで
  • UMIN
    該当フレームの U の最小値。0 から 255 まで
  • ULOW
    該当フレームの U の10%の値。0 から 255 まで
  • UAVG
    該当フレームの U の平均値。0 から 255 まで
  • UHIGH
    該当フレームの U の90%の値。0 から 255 まで
  • UMAX
    該当フレームの U の最大値。0 から 255 まで
  • VMIN
    該当フレームの V のでの最小値。0 から 255 まで
  • VLOW
    該当フレームの V のでの10%の値。0 から 255 まで
  • VAVG
    該当フレームの V のでの平均値。0 から 255 まで
  • VHIGH
    該当フレームの V のでの90%の値。0 から 255 まで
  • VMAX
    該当フレームの V のでの最大値。0 から 255 まで
  • SATMIN
    該当フレームの彩度の最小値。0 から 181.02 まで
  • SATLOW
    該当フレームの彩度の10%の値。0 から 181.02 まで
  • SATAVG
    該当フレームの彩度の平均値。0 から 181.02 まで
  • SATHIGH
    該当フレームの彩度の90%の値。0 から 181.02 まで
  • SATMAX
    該当フレームの彩度の最大値。0 から 360 まで
  • HUEMED
    該当フレームの色相の中央値。0 から 360 まで
  • HUEAVG
    該当フレームの色相の平均値。0 から 360 まで
  • YDIF
    現在フレームと1フレーム前の Y の差分。0 から 255 まで
  • UDIF
    現在フレームと1フレーム前の U の差分。0 から 255 まで
  • VDIF
    現在フレームと1フレーム前の V の差分。0 から 255 まで
  • stat
    out 映像に対象部分を反映させる
    tout, vrep, brng が指定できる。tout+vrep+brng で複数指定も可能
  • color, c
    out の色指定。規定値:yellow

基本コマンド

YAVG の折れ線グラフに縦32ピクセルのグリッドを表示


ffplay -f lavfi -i "movie=input,signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255,drawgrid=0:0:0:32,format=yuv420p"

YAVG, YHIGH の複数表示
ffplay -f lavfi -i "movie=input,signalstats,split[0][1];[0]drawgraph=lavfi.signalstats.YAVG:min=0:max=255[YAVG];[1]drawgraph=lavfi.signalstats.YHIGH:min=0:max=255[YHIGH];[YAVG][YHIGH]blend=c0_mode=and,drawgrid=0:0:0:32,format=yuv420p"

グラフの表示形式は drawgraph で設定できる。
ffplay -f lavfi -i "movie=input,signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255:mode=line:slide=frame:size=900x256,drawgrid=0:0:0:32,format=yuv420p"

テキストファイル(signalstat_drawtext)に表示させる内容を記載してそれを表示させる。表示する内容が増えるとそれだけ負荷も高くなる。テキストの表示位置は drawtext で x=10:y=10 のように指定する。

drawtext で数値をオーバーレイする


ffplay input -vf signalstats=stat=brng+vrep+tout,drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':textfile=signalstat_drawtext.txt

signalstat_drawtext.txt の内容

time %{pts:hms}
Y (%{metadata:lavfi.signalstats.YMIN}-%{metadata:lavfi.signalstats.YMAX})
U (%{metadata:lavfi.signalstats.UMIN}-%{metadata:lavfi.signalstats.UMAX})
V (%{metadata:lavfi.signalstats.VMIN}-%{metadata:lavfi.signalstats.VMAX})
saturation maximum: %{metadata:lavfi.signalstats.SATMAX}

その他に表示できるものは drawtext の Text expansion を参照する。ただし日本語は日本語が使えるフォントでないと文字化けする。
現在時間の表示 %{localtime}
フレーム番号 %{n}
フレームタイプ %{pict_type}

情報をテキストに保存する
ffprobe -f lavfi -i movie=input,signalstats="stat=tout+vrep+brng" -show_frames > signalstats.txt

特定シーンを取り出す場合は sp で開始秒の指定と、trim で長さ(秒)を指定する
ffprobe -f lavfi -i movie=input:sp=10,trim=duration=10,signalstats="stat=tout+vrep+brng" -show_frames > signalstats.txt

関連フィルタ

音声の周波数を映像化する showfreqs

$
0
0

Y軸に振幅、X軸に周波数に変換する showfreqs について。

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

続きを読む

オプション

  • size, s
    映像の解像度。規定値:1024×512
  • mode
    周波数の表示形式の指定。規定値:bar
    • line
    • bar
    • dot
  • ascale
    Y軸の表示単位。規定値:log
    • lin
    • sqrt
    • cbrt
    • log
  • fscale
    X軸表示形式。規定値:lin
    • lin
    • log
    • rlog
  • win_size
    小さくするほど周波数が荒くなる。規定値:w2048
    2の4乗から2の16乗まで
  • win_func
    波形の表示設定。詳細は省略。既定値:hanning
  • overlap
    波形を重複させて表示させる。既定値:1(0, 1)
    win_func で指定したオプションが最適化されて表示される
  • averaging
    波形を時間平均させて表示させる。既定値:1(平均化しない)
    0 はピークだけ表示、大きくするほど表示がゆっくりになる
  • colors
    周波数の色指定:既定値:white
    ‘|’ で複数指定が可能。
    “red|green|blue|yellow|orange|lime|pink|magenta|brown”

基本コマンド

  • ffplay -f lavfi -i amovie=input,showfreqs=s=512x288:mode=bar:ascale=log:fscale=lin:win_size=w2048:win_func=hanning:overlap=1:averaging=1:colors=white
    AAC 48.0 KHz 125Kbps の音声


  • 見やすくした例
    ffplay -f lavfi -i amovie=input,showfreqs=s=512x288:mode=line:ascale=log:fscale=lin:win_size=w256:win_func=hanning:overlap=1:averaging=5:colors=white
    AAC 48.0 KHz 125Kbps の音声を見やすくした例


  • 動画で出力する場合はそのままだと可変フレームの RGBA になるので適宜フレームレートとフォーマットを変換する。
    ffmpeg -i input -filter_complex showfreqs=s=512x288:mode=line:ascale=log:fscale=lin:win_size=w256:win_func=hanning:overlap=1:averaging=5:colors=white,fps=30,format=yuv420p output

  • 一般的なサンプリング周波数を超えた音声を使うと右端が見切れる
    352.8 KHz の音声


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

$
0
0

分離したチャンネルを合わせたり入れ替えたり、フォーマットを変えたりできる。

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

オプション

  • mapping
    入力チャンネル順に YUVA、または RGBA と、それの順番を決める。詳しくは後述
  • format
    出力フォーマット。規定値:yuva444p

mapping について

指定形式は 0xAa[Bb[Cc[Dd]]] で、ABCD, abcd 順に YUVA、または RGBA を割り当てる。大文字がどのデータを、小文字がどこに割り当てるか決め、0 が1入力となり、大文字の部分の数字プラス1が入力数になる。これだとわかりにくいので例を挙げる。

  • Aa 00:Y に1入力のデータの Y(R)を割り当てる
  • Bb 00:U に1入力のデータの Y(R)を割り当てる
  • Cc 00:V に1入力のデータの Y(R)を割り当てる
  • Dd 00:A に1入力のデータの Y(R)を割り当てる
  • Aa 10:Y に2入力のデータの Y(R)を割り当てる
  • Bb 10:U に2入力のデータの Y(R)を割り当てる
  • Cc 10:V に2入力のデータの Y(R)を割り当てる
  • Dd 10:A に2入力のデータの Y(R)を割り当てる
  • Aa 01:Y に1入力のデータの U(G)を割り当てる
  • Bb 01:U に1入力のデータの U(G)を割り当てる
  • Cc 01:V に1入力のデータの U(G)を割り当てる
  • Dd 01:A に1入力のデータの U(G)を割り当てる

基本的に YUVA、または RGBA の個別のデータか、YUVA、または RGBA の全てのデータともう一つのデータをマスクする形で使われる。

フィルタの例

yuv420p の動画を yuv444p に変える

-vf format=yuv420p,extractplanes=y+u+v[y][u][v];[u]scale=2*iw:2*ih[u2];[v]scale=2*iw:2*ih[v2];[y][u2][v2]mergeplanes=0x001020:yuv444p

yuv420p の動画の U と V を入れ替える

-vf format=yuv420p,mergeplanes=0x000201:yuv420p

yuva444p の動画の Y と A を入れ替える

-vf format=yuva444p,mergeplanes=0x03010200:yuva444p

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

$
0
0

チャンネルを分離して個別に出力できる。対応チャンネルは YUV, RGB, アルファ である。

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

YUV をそれぞれ出力する例
ffmpeg -i input -filter_complex "extractplanes=y+u+v[y][u][v]" -map [y] y.mp4 -map [u] u.mp4 -map [v] v.mp4

Y だけ出力する例
ffmpeg -i input -filter_complex "extractplanes=y" y.mp4


ffmpeg で YUV, RGB波形を表示する waveform

$
0
0

histogram に含まれていた waveform オプションが個別のフィルタになり、histogram の waveform は非推奨になっている。

前回書いた記事:ffmpeg でヒストグラムを表示する
公式ドキュメント:FFmpeg Filters Documentation :: waveform

続きを読む

オプション

  • mode, m
    0:row(縦長)「左が0右が255」
    1:column(横長)「上が0下が255」。規定値
  • intensity, i
    同じ輝度がどれだけ分散されているか。小さい値ほど範囲が狭い
    指定範囲:0 から 1
    規定値:0.04
  • mirror, r
    高い数値を column なら左右、または row なら上下入れ替えるかどうか
    指定範囲:0(入れ替えない), 1(入れ替える)
    規定値:1
  • display, d
    0:overlay。各コンポーネントを一緒に表示
    1:parade。各コンポーネントを個別に表示。規定値
  • components, c
    コンポーネント毎の表示指定
    1:Y または R。規定値
    2:U または G
    3:Y, U または R, G
    4:V または B
    5:Y, V または R, B
    6:U, V または G, B
    7:Y, U, V または R, G, B
  • envelope, e
    0:none。規定値
    1:instant。現在の最小と最大を表示
    2:peak。最大と最小をずっと表示する
    3:peak+instant
  • filter, f
    0:lowpass。規定値
    1:flat。輝度と彩度を合わせて表示
    2:aflat。青と赤の輝度と彩度の差異を合わせて表示
    3:chroma。彩度だけを表示
    4:achroma。青と赤の彩度の差異を合わせて表示
    5:color。実際の色を表示

基本コマンド

ffplay -f lavfi -i mandelbrot -vf waveform=m=1:i=.04:r=1:d=1:c=1:e=0:f=0

waveform(R) のプレビューサンプル

2チャンネルの値を2次元で表示する vectorscope

$
0
0

histogram に含まれていた color オプションが個別のフィルタになり、vectorscope として独立した。現在 histogram の color は非推奨になっている。

前回書いた記事:ffmpeg でヒストグラムを表示する
公式ドキュメント:FFmpeg Filters Documentation :: vectorscope

続きを読む
  • mode, m
    0:gray。規定値
    1:color
    2:color2
    3:color3
    4:color4
  • x
    X軸のチャンネル指定。規定値:1
    0, 1, 2 の順番に YUV, RGB
  • y
    Y軸のチャンネル指定。規定値:2
    0, 1, 2 の順番に YUV, RGB
  • intensity, i
    mode が gyay, color, color3 のとき同じ輝度がどれだけ分散されているか。
    小さい値ほど範囲が狭い。指定範囲:0 から 1
    規定値:0.04
  • envelope, e
    0:none(規定値)
    1:instant(現在の最小と最大を表示)
    2:peak(最大と最小をずっと表示する)
    3:peak+instant

基本コマンド

ffplay -f lavfi -i mandelbrot -vf vectorscope=m=1:x=1:y=2:i=.04:e=0

vectorscope のプレビューサンプル

音声をベクタースコープで表示する avectorscope

$
0
0

表示する色の設定とフェードの色設定、リサジュー図形での描写が可能。

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

続きを読む
  • mode, m
    表示形式
    0:lissajous。リサジュー図形を45度回転。規定値
    1:lissajous_xy。リサジュー図形
    2:polar。半円にリサンプル
  • size, s
    出力解像度。規定値:400×400
  • rate, r
    出力フレームレート。大きい値ほど設定通りには出力しない
    規定値:25
  • rc, gc, bc, ac
    赤、緑、青、透過のコントラスト指定。それぞれ 0 から 255 まで
    規定値は順番に 40, 160, 80, 255
  • rf, gf, bf, af
    赤、緑、青、透過のフェード指定。それぞれ 0 から 255 まで
    規定値は順番に 15, 10, 5, 5
  • zoom
    エフェクトを拡大する。1 から 10 まで
    規定値:1

基本コマンド

ffplay -f lavfi -i "amovie=input,avectorscope=m=0:s=400x400:r=25:rc=40:gc=160:bc=80:ac=255:rf=15:gf=10:bf=5:af=5:zoom=1"
ffmpeg -i input -filter_complex avectorscope=m=0:s=400x400:r=25:rc=40:gc=160:bc=80:ac=255:rf=15:gf=10:bf=5:af=5:zoom=1 -acodec copy output

avectorscope のプレビューサンプル


ffmpeg でクロマキー合成 その2

$
0
0

colorkey と同じような機能だが、こちらは出力フォーマットが YUVA になるので動画にクロマキー処理をした動画をオーバーレイするのに使う。

使うにはまだリリースされていない 2.8.2(予定)か、最新git から使える。

公式ドキュメント:FFmpeg Filters Documentation :: chromakey
avfilter/vf_chromakey: Add chromakey video filter

関連記事
ffmpeg でクロマキー合成

続きを読む

オプション内容

  • color
    指定した色を透過させる。16進数形式か、色名を指定
  • similarity
    一致の範囲指定。0.01 は完全一致、1は全画面。規定値:0.01(float)
  • blend
    似た色の透過の影響具合、0 は指定した色だけで大きくするほど似た色も少しずつ透過する。
    つまり透過のグラデーションがきれいになる。最大値 1。規定値:0(float)

基本コマンド

colorkey と基本的には同じ。
ffmpeg -i input1 -i input2 -filter_complex [1:0]chromakey=red:.01:0[1a];[0:0][a1]overlay output
ffmpeg -i input1 -i input2 -filter_complex [1:0]chromakey=0xff0000:.01:0[1a];[0:0][a1]overlay output

マスクして2入力を合わせる maskedmerge

$
0
0

使うにはまだリリースされていない 2.8.2(予定)か、最新git から使える。

3入力目をマスクにして、1入力目の映像と、2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。マスクの割合は各コンポーネント(YUVA, RGBA)の平均から1,2入力をどの程度合わせるかで指定する。0 ならば1入力目を、255(8bit)ならば2入力目を反映させる

マスクの指定には別ファイルを使う方法と、フィルタを当てて各コンポーネントを調整する方法とがある。各コンポーネントを調整には lut が使いやすい。

Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)

別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。

以下方法が手軽に低負荷で出来るようになったが、今回の方法は完全に2つのフィルタを使い分けるわけではない。
ニコ生で高画質配信する複合フィルタの例

公式ドキュメント:FFmpeg Filters Documentation :: lut, lutrgb, lutyuv

関連記事
YUV、彩度、色相 を見える化する signalstats

オプションにはマスクに使うコンポーネントを指定できるが、1 から f までどれを使っているのかよくわからない。規定値は 0xf で全てのコンポーネントを対象とする。

続きを読む

コマンド例

以下は全て YUV 動画を元とし、効果がわかりやすいようにノイズフィルタをかけている。

暗いところだけノイズ

輝度60以下にノイズ、60より大きいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u[0a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge

明るいところだけノイズ

輝度180以上にノイズ、180より小さいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u[0a];[2]lutyuv=y="if(val\, if(lt(val\,180)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge

全体にノイズをかけて、暗いところだけぼかす

上2つのフィルタの応用
ffplay -i input -vf split=3[0][1][2];[0]smartblur[0a];[1]noise=alls=100:allf=t+u[1a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1a][2a]maskedmerge

全体をくっきりさせて、暗いところだけぼかす

配信向きのフィルタ
ffplay -i input -vf split=3[0][1][2];[0]smartblur[0a];[1]unsharp[1a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1a][2a]maskedmerge

Viewing all 311 articles
Browse latest View live


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