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

フィルタの挙動について:
ffmpeg: aphasemeter, meaning of measurement – Super User
audio – Calculate Phase angle between two signals i.e. digital Phase meter – Signal Processing Stack Exchange

基本コマンド

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

基本は上から下に流れるので、transposeフィルタを使って左から右に流すコマンド。
ffplay -f lavfi -i "amovie=input,aphasemeter=25:400x800:2:7:1:yellow:1[out1],transpose=2[out0]"

ピクセル数はそのままに映像を回転させる transpose

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

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

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

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

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

2つ入力した映像の輝度、コントラスト、構造などを軸にピクセル単位の比較だけではなく周囲のピクセルとの相関をみて比較してオリジナルにどれだけ忠実であるか SSIM の値を計算する。主な用途はエンコード前後を比較してどれだけ劣化したのか、特定のフレームを抽出してエンコードを見直したりする。比較する動画は同じ解像度とfps、ピクセルフォーマットである必要がある。libx264 エンコードでリアルタイムで計測する場合はオプションの-tune ssim -ssim 1を使う。

ファイルの入力順が逆だったのを訂正した。2021年8月11日
1入力がオリジナルの動画、2入力がSSIMを計算する動画ではなく、1入力がSSIMを計算する動画で、2入力がオリジナルの動画でlibvmafフィルタと同じ順番。

Continue reading “2つの映像の画質評価をする SSIM”

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

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

2024年5月3日のコミットで非推奨に変わったので、今後(7.0より先)はscaleフィルタで代用する。

リサイズする scale

Continue reading “比較する動画の解像度に合わせる scale2ref”

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

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

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

Windows の ffmpeg で生放送する方法 : pp
Windows の ffmpeg で生放送する方法 : 3次元デノイズフィルタ(hqdn3d)

そのほかの関連フィルタ:強力な2次元デノイザ sab

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

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