2015年7月のニコ生統計

集計期間は週間のニコ生統計の7月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。

Continue reading “2015年7月のニコ生統計”

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

1入力目の最後の音量を絞りながら2入力目の音量を徐々に上げてつなげるacrossfadeフィルタの使い方。単純に音声ファイルをつなげるのならconcatを使う。overlap, oを有効にすると重なっている時間duration, dだけ2ファイルの合計時間から短くなる。音声の途中でクロスフェードするならafade, amixフィルタを併用する。

concat を使い分ける

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

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 できれいにロゴを消す方法”