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 でヒストグラムを表示する”

リアルタイムでVUメーターを表示する showvolume

音量をリアルタイムでメーター表示する ffmpeg のshowvolumeのフィルタの使い方。出力フォーマットは RGBA。条件をつければ指定 dB の範囲に色を変えられる。

基本コマンド

映像をメーターに差し替える。
ffmpeg -i input -filter_complex showvolume=r=25:b=1:w=400:h=20:t=1:v=1:s=0 -c:a copy output
ffplay -f lavfi -i amovie=input,showvolume

2チャンネルのメーターだけを再生する。
ffplay -f lavfi "amovie=input,asplit[a][out1];[a]showvolume=b=4:w=720:h=68[out0]"

音量メーターの例

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

Continue reading “リアルタイムでVUメーターを表示する showvolume”

サンプリング波形を一枚画像で出力する showwavespic

音声データを読み込みサンプリング波形を一枚画像で出力するshowwavespicの使い方。音声のどの時間帯でどのくらいの音量があるのかがよくわかる。

読み込み開始時点や終了時点を変更する -ss, -t, -to などはエラーになるので使えない。出力フォーマットはグレースケール RGBA になるのでoverlayフィルタなどで別の映像と合わせるのにも使える。

リアルタイムに同様の波形を調べるにはshowwavesフィルタを使う。
音声波形を表示する showspectrum, showwaves の使い方

基本コマンド

既定値からチャンネル別に表示。
ffmpeg -i input -filter_complex "showwavespic=s=600x240:split_channels=1:colors=red|green:scale=0" showwavespic.png

waveform のサンプル画像

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

オプション

  • size, s[image_size]
    画像の出力解像度
    既定値:600×240
  • split_channels[boolean]
    チャンネル別に表示するかどうか。0 にするとチャンネルの数だけ色がミックスされる
    既定値:0(しない)
  • colors[string]
    波形の色指定。チャンネル数毎に | で指定する
    既定値:”red|green|blue|yellow|orange|lime|pink|magenta|brown”
  • scale[int]
    振幅のサイズ指定
    • 0, lin:線形。一番小さい。既定値
    • 1, log:対数。一番大きい
    • 2, sqrt:平方根。2番目に小さい
    • 3, cbrt:立方根。3番目に小さい(2番目に大きい)
  • draw[int]
    描写方法の指定
    • 0, scale:ダウンサンプルして描写する。既定値
    • 1, full:そのまま描写する

関連記事

ffmpeg で指定秒ごとに分割する方法

出力フォーマットにsegmentmuxer を使って指定秒ごとに分割する。ストリームコピーする場合は GOP の関係で正確な指定秒ごとに分割できない。さらにファイルサイズを指定(-fs)して分割は出来ない。ニコ生のタイムシフトの個人的なバックアップ(ニコ動に非公開で投稿する)にも使える。

詳細な分割設定ができる Segment
ffmpeg で指定時間でカットするまとめ

-segment_timeで分割する秒を指定する。

ffmpeg -analyzeduration 30M -probesize 30M -i input -c copy -f segment -flags +global_header -segment_format_options movflags=+faststart -reset_timestamps 1 -segment_time 720 output%02d.mp4

HLS 用の m3u8 を出力するにはコマンドもある。動画のファイルは m3u8 のファイル名.ts になる。
H.264/AVC.mp4 をコピーする場合は-bsf:v h264_mp4toannexbをつける。

-hls_timeで分割する秒を指定する。
ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

ffmpeg -analyzeduration 30M -probesize 30M -i input -c copy -f segment -flags +global_header -segment_format_options movflags=+faststart -reset_timestamps 1 -bsf:v h264_mp4toannexb -hls_time 720 output.m3u8

公式ドキュメント
FFmpeg Formats Documentation :: segment, stream_segment, ssegment
FFmpeg Formats Documentation :: hls

連結する場合は-segment_listで ffconcat 形式を指定すればリストファイルを同時に作成する。

-segment_list out.ffconcatで分割したファイルをまとめたリストを出力する。
ffmpeg -i input.mp4 -c copy -map 0 -flags +global_header -f segment -segment_time 60 -segment_list out.ffconcat -segment_format_options movflags=+faststart -reset_timestamps 1 out%03d.mp4

上の out.ffconcat を読み込んで1つのファイルに戻す。
ffmpeg -i out.ffconcat -c copy -segment_format_options movflags=+faststart output.mp4

以下のコマンドを追加した。2016年2月13日
-flags +global_header -segment_format_options movflags=+faststart -reset_timestamps 1

-flags +global_headerはヘッダーを明示する
-segment_format_options movflags=+faststartは読み込みから再生開始を早める(特にブラウザのビデオタグで見る場合)
-reset_timestamps 1はタイムスタンプを初期化する(反対のオプションは -copyts)
-segment_listの説明を追加。分割しても連結しやすくなった。2019年10月30日

2015年5月のニコ生統計

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

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