YUV のデータを数値で表示する signalstats

基本コマンド

コンソールに統計データを表示する。
ffprobe -f lavfi movie=input,signalstats="stat=tout+vrep+brng" -show_frames

統計情報をプレビューする。
ffplay -i input -vf signalstats=out=tout

drawgraphフィルタの併用で折れ線グラフを表示する。
ffplay -f lavfi -i "movie=input,signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255,drawgrid=0:0:0:32,format=yuv420p"

一定間隔で映像に線を引く drawgrid
メタデータを映像化する drawgraph, adrawgraph

metadataフィルタの併用でコンソールにを表示する。
ffplay -f lavfi -i movie=input,signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'

TVスケールから外れているピクセルをシアンで描写する。
ffplay -i input -vf signalstats=out=brng:color=cyan

複数のメタデータをログに出力する。
ffmpeg -i input -vf signalstats,metadata=mode=print:key=lavfi.signalstats.YAVG:file=YAVG.txt,metadata=mode=print:key=lavfi.signalstats.UAVG:file=UAVG.txt,metadata=mode=print:key=lavfi.signalstats.VAVG:file=VAVG.txt -f null -
ffprobe -v error -f lavfi -i movie=input,signalstats -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG -of csv > YUVAGV.csv

メタデータをコンソールに表示する metadata, ametadata

YUVの値だけを改行してテキストに書き出す。trim=end_frame=1を外すと全フレーム出力する。
ffprobe -f lavfi -i "movie=input,signalstats,trim=end_frame=1" -show_entries frame_tags=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG -of default=noprint_wrappers=1:nokey=1 > yuv.txt

trim フィルタの使い方

YUVのYの値を映像に描写する。
ffplay -i input -vf signalstats,drawtext=y=h/32:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=36:fontcolor=white:box=1:boxcolor=black@0.4:text='"Y ("%{metadata\:lavfi.signalstats.YMIN}-%{metadata\:lavfi.signalstats.YLOW}-%{metadata\:lavfi.signalstats.YAVG}-%{metadata\:lavfi.signalstats.YHIGH}-%{metadata\:lavfi.signalstats.YMAX})'

文字を描写する drawtext

他のアプリケーションに利用しやすいJSON形式に書き出す。
ffprobe -f lavfi -i "movie=input,signalstats,trim=end_frame=100" -show_entries packet=pts_time -show_entries frame_tags=lavfi.signalstats.YAVG,lavfi.signalstats.UAVG,lavfi.signalstats.VAVG -of json > yuv.json

明るさを調べるだけならdeflickerフィルタでも可能。
フリッカー(ちらつき) を低減する deflicker

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

Continue reading “YUV のデータを数値で表示する signalstats”

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

通常読込時点の指定には-ssで最初からの経過秒を指定していたが、これからは最後からの秒を指定できるようになった。

対象コミット: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

コーデックコピーする場合は GOP 間隔に依存するので指定した値通りにはカットできないことがある。
ffmpeg -sseof -<seconds> -i input -t <seconds> -c copy output

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

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

音量を調べるにはvolumedetect、ebur128、showwavespicなどのフィルタがある。

Continue reading “ffmpeg で聞き取りやすい音量に変える dynaudnorm”

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

reverse, areverseフィルタを使って逆再生にエンコードする。長時間逆再生にすると大量にメモリを消費するのであらかじめ時間を区切った方が処理が速く済む。

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

ffmpeg でインターレース解除

30000/1001fpsのインターレースの動画からアニメの24000/1001fpsのプログレッシブ動画にするためにインターレースを解除、逆テレシネする。フレームを間引くにはいくつかの方法があるので目的に合わせてフィルタを使う。

ポイントはフレームを間引く必要があるかどうかと、テロップなどの片フィールド補間がいるかどうか。フレーム間引きするにはdecimateを併用し、pullupdetelecineには必要ない。

片フィールドを補間した 60pはw3fdifだけ使うのが手軽だが、他にもyadifbwdifnnediestdifもBob化できる。yadifbwdifestdifの第1引数を1にする必要があるのは片フィールド補間しBob化する場合である。

逆テレシネするならfieldmatchフィルタを使って、逆テレシネ漏れにestdifフィルタの併用がよさそう。毎フレームのフィールドが動く映像は逆テレシネはせずにbwdifフィルタで片フィールド補間するか、30pにするのが無難にきれいになる。

片フィールドを補間しない場合にnnediは速度の割にはあまり品質はよくないかもしれない。

インターレース解除、または逆テレシネとリサイズを併用する場合は、インターレース解除、または逆テレシネした後にリサイズする。
yadif,scale=1280:-2

フレームを間引くのならインターレース解除した後に行うことでリサイズするフレーム数を減らせて処理がはやくなる。
yadif,decimate,scale=1280:-2

リサイズする scale
Zライブラリを使ったリサイズフィルタ zscale

24pの処理速度比較
8 < 7 < 6 < 5 << 4 << 3 < 2 << 1

  1. フィールドパターンを手動の逆テレシネして、間引きも手動指定
    “separatefields,shuffleframes=0 1 4 3 6 5 8 9 -1 -1,setfield=tff,weave,setpts=(N*1001)/(24000*TB),setparams=field_mode=prog” -r 24000/1001 -fps_mode cfr
  2. フィールドパターンを手動の逆テレシネして、間引きは自動
    detelecine=start_frame=3
  3. 手動インターレース解除して、間引きも手動指定
    fieldhint=hint.txt:pattern,select=mod(n-1\,5),fps=24000/1001
  4. 高速なプログレVFR(-rで固定フレームにできる)(速度を重視)
    pullup -r 24000/1001
  5. 意外に速くて高品質で 24fps化(品質と速度を両立)
    fieldmatch,decimate
  6. 一般的な 24fps化(品質と速度を両立)
    yadif=0:-1:1,decimate
  7. yadif より高画質(常に高画質とは限らない)な 24fps化(速度より品質重視)
    bwdif=0:-1:1,decimate
  8. IVTCとyadifを併用して24fps化(速度より品質重視)
    fieldmatch=mode=pc:cthresh=40,yadif=0:-1:1,decimate
  9. 一般的なインターレース解除(品質と速度を両立)
    yadif=0:-1:1
  10. yadif より高画質(常に高画質とは限らない)
    bwdif=0:-1:1
  11. テロップなど60pのBob
    yadif=1:-1:1
  12. テロップなど60pのBob
    bwdif=1:-1:1
  13. テロップなど60pのBob
    w3fdif=1:0
  14. テロップなど60pのBob(かなり遅いが一番高画質)
    nnedi=deint=1:field=af

Continue reading “ffmpeg でインターレース解除”

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

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

出力はYUV444
ffmpeg -i input -c:v libx264 -qp 0 -g 1 -tune fastdecode -c:a copy output.mp4

出力はRGB
ffmpeg -i input -c:v libx264rgb -qp 0 -g 1 -tune fastdecode -color_range
pc -c:a copy output.mp4

ffmpeg できれいにロゴを消す方法

ffmpeg には標準でロゴを消すフィルタがあるが、以前紹介した特定の場所にだけフィルタを当てる方法と、ロゴ消しに適したロゴデータの作り方を交えてロゴをきれいに消す方法。

ffmpeg でロゴを消すフィルタと言えば、removelogodelogoがあるが、ロゴデータを元にロゴを消すのがremovelogoで、座標を指定して周りの色でブレンドするのがdelogoである。

Continue reading “ffmpeg できれいにロゴを消す方法”

明るいところ、暗いところにフィルタを当てる

明暗の度合いでもマスクできるのでこれを応用して一つの映像に複数のフィルタを使い分ける方法。特定色ならcolorkeyフィルタを使ってマスクすることもできる。一般的には映像をシャープにするほど容量は大きく、ぼかすほど容量は小さくなるので、シャープとぼかしを使い分けて高画質配信を目指す。

colorkey の使い方:ffmpeg でクロマキー合成

なぜぼかしも併用するかと言えばビットレートの節約になるのも正しいが、ニコ生のようなビットレート制限が厳しいところでは、低解像度で暗くて見えにくい部分にビットレートをたくさん割り当てる必要はないからである。

Continue reading “明るいところ、暗いところにフィルタを当てる”

ffmpeg でヒストグラムを表示する

histogramフィルタの使い方

動画編集ツールによくあるヒストグラムを表示するhistogramフィルタの使い方。以前あったcolor、waveformオプションは廃止になり個別のフィルタとして独立した。

2チャンネルの値を2次元で表示する vectorscope
ffmpeg で YUV, RGB波形を表示する waveform

Continue reading “ffmpeg でヒストグラムを表示する”