月別アーカイブ: 2015年8月

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

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

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

Windows の ffmpeg で生放送する方法 : pp
続きを読む ニコ生で使うデノイズフィルタの例

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

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

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

基本コマンド

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

公式ドキュメント: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

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=1

drawgraph フィルタの併用で折れ線グラフを表示できる
ffplay -f lavfi -i "movie=input,signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255,drawgrid=0:0:0:32,format=yuv420p"
メタデータを映像化する 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)'
メタデータをコンソールに表示する 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 フィルタの使い方

他のアプリケーションに利用しやすい JSON形式に書き出す
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 json > yuv.json

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

オプション

  • stat[flags]
    コンソールに統計データを表示する
    既定値:0

    • 0:表示しない。既定値
    • 1, tout
      時間的な異常値のピクセルを識別する。時間的な異常値とは同じフィールドの隣接するピクセルとは異なるピクセルである
    • 2, vrep
      縦のラインの反復を識別する。縦のラインの反復にはフレーム内の近似のピクセルを含む
    • 3, tout+vrep
    • 4, brng
      TVスケール(リミテッドレンジ)から外れているピクセルを識別する
    • 5, tout+brng
    • 6, vrep+brng
    • 7, tout+vrep+brng
  • out[int]
    映像に統計情報をハイライト表示する

    • 0, tout
    • 1, vrep
    • 2, brng
  • color, c[color]
    ハイライトの色指定
    既定値:yellow
    メタデータでの設定項目。metadatadrawgraph を併用する

  • 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 から 181.02 まで
  • HUEMED
    該当フレームの色相の中央値。0 から 360 まで
  • HUEAVG
    該当フレームの色相の平均値。0 から 360 まで
  • YDIF
    現在フレームと1フレーム前の Y の差分。0 から 255 まで
  • UDIF
    現在フレームと1フレーム前の U の差分。0 から 255 まで
  • VDIF
    現在フレームと1フレーム前の V の差分。0 から 255 まで

追記
オプションの説明を詳しく書いた。2016年8月16日

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

通常読込時点の指定には -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