集計期間は週間のニコ生統計の7月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
入力した2つの音声にクロスフェードをかける acrossfade の使い方
1入力目の最後の音量を絞りながら2入力目の音量を徐々に上げてつなげるacrossfade
フィルタの使い方。単純に音声ファイルをつなげるのならconcat
を使う。overlap, oを有効にすると重なっている時間duration, dだけ2ファイルの合計時間から短くなる。音声の途中でクロスフェードするならafade, amix
フィルタを併用する。
afade
フィルタのcurveのオプションの説明は以下を参照。
音声のフェードイン、フェードアウトの設定ができる afade
フェードトランジションのカーブを別フィルタに実装する
基本コマンド
ffmpeg -i audio1 -i audio2 -filter_complex acrossfade output.wav
公式ドキュメント:FFmpeg Filters Documentation : acrossfade
オプション
- nb_samples, ns[int]
フェード部分のサンプリング周波数の指定
既定値:44100
範囲:1 から 2.14748e+08 まで - duration, d[duration]
前後それぞれのフェード時間。無指定だと1秒分のサンプル数
既定値:nb_samples - overlap, o[boolean]
フェード部分を重ねるかどうか
既定値:1 - curve1, c1
1入力目のフェードアウトのカーブのアルゴリズム指定。詳しくはAfadeCurves – FFmpegを参照 - 0, tri:既定値
- 1, qsin
- 2, esin
- 3, hsin
- 4, log
- 5, ipar
- 6, qua
- 7, cub
- 8, squ
- 9, cbr
- 10, par
- 11, exp
- 12, iqsin
- 13, ihsin
- 14, dese
- 15, desi
- 16, losi
- 17, nofade
- curve2, c2
2入力目のフェードインのカーブのアルゴリズム指定 - 0, tri:既定値
- 1, qsin
- 2, esin
- 3, hsin
- 4, log
- 5, ipar
- 6, qua
- 7, cub
- 8, squ
- 9, cbr
- 10, par
- 11, exp
- 12, iqsin
- 13, ihsin
- 14, dese
- 15, desi
- 16, losi
- 17, nofade
kakoroku で公式の長時間放送が全部保存できない原因について
コミュ掲示板の 7767 より、ホラー「監死カメラ」シリーズ48時間一挙放送/ホラー百物語 : lv228170627の7番目以降の TS とコメントが保存できない理由と対処法について。
原因
48時間の一挙放送であるが、同じ内容の4回ループ放送で同じ内容の部分は同じデータを流しているために kakoroku が重複データとして扱い、2ループ目以降の TS やコメントが保存できない。
対処法
TS データは同じなので 7ファイル目以降を保存する必要は無いが、コメントファイルがこのままでは全部保存できないので別の方法を考える。
コメントを kakoroku 以外にコメビューで保存する方法と、自前にスクリプトを書いて過去コメントを保存して vpos に合わせてシフトと分割も一括する方法の2通りが考えられる。
コメントのシフトと分割については Win ユーザーならNicomentXenoglossia を使う。
過去コメントはこの方法でも保存できる
アドレス入力でニコ生のコメントを表示する
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
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})'
他のアプリケーションに利用しやすい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 で後ろから読み込みが可能に
通常読込時点の指定には-ss
で最初からの経過秒を指定していたが、これからは最後からの秒を指定できるようになった。
公式ドキュメント: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
などのフィルタがある。
映像と音声を逆再生にエンコードする
reverse, areverse
フィルタを使って逆再生にエンコードする。長時間逆再生にすると大量にメモリを消費するのであらかじめ時間を区切った方が処理が速く済む。
ffmpeg でインターレース解除
30000/1001fpsのインターレースの動画からアニメの24000/1001fpsのプログレッシブ動画にするためにインターレースを解除、逆テレシネする。フレームを間引くにはいくつかの方法があるので目的に合わせてフィルタを使う。
ポイントはフレームを間引く必要があるかどうかと、テロップなどの片フィールド補間がいるかどうか。フレーム間引きするにはdecimate
を併用し、pullup
、detelecine
には必要ない。
片フィールドを補間した 60pはw3fdif
だけ使うのが手軽だが、他にもyadif
とbwdif
、nnedi
、estdif
もBob化できる。yadif
、bwdif
、estdif
の第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
- フィールドパターンを手動の逆テレシネして、間引きも手動指定
“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 - フィールドパターンを手動の逆テレシネして、間引きは自動
detelecine=start_frame=3 - 手動インターレース解除して、間引きも手動指定
fieldhint=hint.txt:pattern,select=mod(n-1\,5),fps=24000/1001 - 高速なプログレVFR(
-r
で固定フレームにできる)(速度を重視)
pullup -r 24000/1001 - 意外に速くて高品質で 24fps化(品質と速度を両立)
fieldmatch,decimate - 一般的な 24fps化(品質と速度を両立)
yadif=0:-1:1,decimate - yadif より高画質(常に高画質とは限らない)な 24fps化(速度より品質重視)
bwdif=0:-1:1,decimate - IVTCとyadifを併用して24fps化(速度より品質重視)
fieldmatch=mode=pc:cthresh=40,yadif=0:-1:1,decimate - 一般的なインターレース解除(品質と速度を両立)
yadif=0:-1:1 - yadif より高画質(常に高画質とは限らない)
bwdif=0:-1:1 - テロップなど60pのBob
yadif=1:-1:1 - テロップなど60pのBob
bwdif=1:-1:1 - テロップなど60pのBob
w3fdif=1:0 - テロップなど60pのBob(かなり遅いが一番高画質)
nnedi=deint=1:field=af
H.264/AVC でシークしやすい中間出力ファイルに変換する
ffmpeg できれいにロゴを消す方法
ffmpeg には標準でロゴを消すフィルタがあるが、以前紹介した特定の場所にだけフィルタを当てる方法と、ロゴ消しに適したロゴデータの作り方を交えてロゴをきれいに消す方法。
ffmpeg でロゴを消すフィルタと言えば、removelogo
とdelogo
があるが、ロゴデータを元にロゴを消すのがremovelogo
で、座標を指定して周りの色でブレンドするのがdelogo
である。