Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 310 articles
Browse latest View live

CUDA を使ったハードウェアアクセレーションフィルタのまとめ

$
0
0

m-ab-s/media-autobuild_suite で調べたところ、–enable-ffnvcodec –enable-cuda –enable-cuvid –enable-nvenc –enable-nvdec を基本に、–enable-libnpp –enable-nonfreescale_npp, transpose_npp フィルタが使え、–enable-cuda-llvm の追加で yadif_cuda, thumbnail_cuda フィルタが使える。現状 Zeranoe FFmpeg ではこれらのフィルタは使えない。

ffmpeg に nvenc(cuda)をインストールする

scale_npp リサイズ

iw, ih の書式が使えるので手軽に半分の解像度の指定ができる。

NVDEC を使う
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf "scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC を使わない
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC, NVENC を使う
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf "scale_npp=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -c:a copy output.mp4

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

オプション

  • w[string]
    出力解像度の横幅。-n が使える
    既定値:”iw”(入力横幅)
  • h[string]
    出力解像度の縦幅。-n が使える
    既定値:”ih”(入力縦幅)
  • format[string]
    出力フォーマットの指定
    既定値:”same”
  • interp_algo[int]
    • 1, nn:Nearest Neighbour
    • 2, linear:Linear
    • 4, cubic:Cubic
    • 5, cubic2p_bspline:2-parameter Cubic (B=1, C=0)
    • 6, cubic2p_catmullrom:2-parameter Cubic (B=0, C=1/2)
    • 7, cubic2p_b05c03:2-parameter Cubic (B=1/2, C=3/10)
    • 8, super:Supersampling
    • 16, lanczos:Lanczos

yadif_cuda インターレース解除

フレームを間引くならフィルタの最後に decimate フィルタを追加する。

NVDEC を使う
ffmpeg -hwaccel cuvid -c:v mpeg2_cuvid -i input -vf "yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC を使わない
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4

NVDEC, NVENC を使う
ffmpeg -hwaccel cuvid -c:v mpeg2_cuvid -i input -vf "yadif_cuda" -c:v hevc_nvenc -c:a copy output.mp4

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

オプション

yadif フィルタとオプション内容は同じ。

  • mode[int]
    モード指定
    既定値:0
    • 0, send_frame
      2枚のフィールドから1枚のフレームを作る。既定値
    • 1, send_field
      1枚のフィールドから1枚のフレームを作る
      いわゆる片フィールド補間でフレーム数が2倍になる
    • 2, send_frame_nospatial
      0 に似ているが空間軸のチェックを行わない
    • 3, send_field_nospatial
      1 に似ているが空間軸のチェックを行わない
  • parity[int]
    フィールドタイプを指定する
    自動で判断できなければ tff と判断する
    既定値:-1
    • 0, tff
      トップフィールドファースト
    • 1, bff
      ボトムフィールドファースト
    • -1, auto
      自動指定。既定値
  • deint[int]
    どのフレームを処理するか
    既定値:0
    • 0, all
      すべて。既定値
    • 1, interlaced
      インターレースフラグがあるのだけ

transpose_npp 映像回転

NVDEC, NVENC を使う。NVENC を使わないとフィルタが使えないかもしれない。
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=format=yuv420p,transpose_npp=cclock_flip -c:v h264_nvenc -c:a copy output.mp4

オプション

transpose フィルタとオプション内容は同じ。

  • dir[int]
    回転方向の設定
    • 0, cclock_flip
      反時計回りに90度回転し上下反転。既定値
    • 1, clock
      時計回りに90度回転
    • 2, cclock
      反時計回りに90度回転
    • 3, clock_flip
      時計回りに90度回転し上下反転
  • passthrough[int]
    フィルタを当てた後の縦と横の解像度を比較して回転をそのままにするかやめるかの設定
    • 0, none
      なにもしない。既定値
    • 1, landscape
      横解像度が縦解像度以上になるとフィルタの効果を打ち消す
    • 2, portrait
      縦解像度が横解像度以上になるとフィルタの結果そのまま返す

thumbnail_cuda サムネイル出力

一定フレーム間隔で画像出力するときに使うフィルタ。考えられる用途はライブ配信サイトで見られるサムネイルの定期更新が考えられる。しかしこのフィルタは -filter_complex で複数出力すると出力しなかったりで扱いが難しい。もしかして GPU の制限かもしれない。

NVDEC を使う
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf "thumbnail_cuda=2" -vframes 1 output.jpg

NVDEC を使わない
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,thumbnail_cuda=2,hwdownload,format=nv12" -vframes 1 output.jpg

ffmpeg ではデコードできない Animated WebP に出力。setpts フィルタの分数と thumbnail_cuda フィルタの値をそろえる
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf "setpts=(PTS-STARTPTS)/300,thumbnail_cuda=300,hwdownload,format=nv12" -vframes 100 -loop 0 output.webp

映像と音声の pts を扱う setpts, asetpts

動画出力しながらサムネイルも出力。fps フィルタの値の逆数と thumbnail_cuda フィルタの値の積から、その秒間隔で画像出力する
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -c:v libx264 -c:a copy output.mp4 -vf fps=1/10,format=nv12,hwupload_cuda,thumbnail_cuda=10,hwdownload,format=nv12 -vsync 0 -an output-%03d.jpg

公式ドキュメントはない

オプション

thumbnail フィルタと同じ。

n[int]
おおよそのフレーム間隔で出力する
既定値:100
範囲:2 から INT_MAX まで


ARIB字幕をdemuxする libaribb24

$
0
0

日本のテレビで表示されるARIB(アライブ)字幕を動画のエンコードと一緒に字幕もつけることができる。今までは映像と音声のエンコードと字幕を同時に扱うことはできなかった。

標準規格概要(STD-B24)|一般社団法人 電波産業会
ARIB外字 – Wikipedia

ffmpeg 4.2 から対応し、VLC 3.0 から動画再生に字幕を表示できるようになった。
ffmpeg 4.2 リリース
VLC 3.0 がリリースし ARIB 字幕や AV1 デコードに対応

ARIB字幕を扱うツール。
maki-rxrz/Caption2Ass_PCR: [DL] http://1drv.ms/1PO9Ptq
tsCaption | ass srt tsファイルから字幕追加 tsファイルから字幕取り出し tsファイルの字幕表示 tsファイルの字幕削除ができます: my0nio

インストール

git clone https://github.com/nkoriyama/aribb24
cd aribb24
autoreconf -fiv
./configure --enable-static --disable-shared
make
make install

m-ab-s/media-autobuild_suite は未対応なので手動でインストールする。msys64 フォルダにある、mingw64.exe を起動してインストールする。

cd build
git clone https://github.com/nkoriyama/aribb24
cd aribb24
autoreconf -fiv
./configure --prefix=/local64 --enable-static --disable-shared
make
make install

ffmpeg にリンクする。

PKG_CONFIG_PATH="/local64/lib/pkgconfig" ./configure --enable-libaribb24 --enable-version3 --pkg-config-flags=--static --extra-ldflags=-static

基本コマンド

TSファイルからremuxして再びTSに字幕をコピーすることはできない。-fix_sub_duration をつけないと字幕の表示時間がおかしくなるので必ずつける。

ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -map 0:v -map 0:a -map 0:s -c:v libx264 -c:a copy -c:s mov_text output.mp4

ASS字幕に出力する。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -c:s ass output.ass

字幕の表示時間を一律にずらすなら -itsoffset をつける。2秒遅らせる例。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -itsoffset 2 -i input.ts -c:s ass output.ass

公式ドキュメント
FFmpeg Codecs Documentation : libaribb24
ffmpeg Documentation : Subtitle options

オプション

オプション指定してどのように変化があるのかよくわかっていない。

  • -aribb24-base-path[string]
    Sets the base path for the libaribb24 library. This is utilized for reading of configuration files (for custom unicode conversions), and for dumping of non-text symbols as images under that location.
    既定値:無指定
  • -aribb24-skip-ruby-text[boolean]
    Tells the decoder wrapper to skip text blocks that contain half-height ruby text.
    既定値:1

remove.bg でゲットした小さな透過画像を元画像に取り入れる

$
0
0

画像の背景を削除して被写体を切り抜くウェブサービス remove.bg で手に入れた低解像度の透過画像をオリジナルの画像に透過情報を適用する。解像度が異なるのでオリジナルのサイズを手動で指定する。

Remove Background from Image – remove.bg

どうして解像度が小さくなるかというと無料で利用すると解像度は小さくなり、有料サービスを利用するとオリジナルの解像度が利用できる。

Pricing – remove.bg

ffmpeg のリサイズフィルタで一番高品質の zscale フィルタの spline36 を使う。foo にオリジナルの画像の横幅を、bar にオリジナルの縦幅の値を指定する。オリジナル画像はJPG、PNG等どの形式でも可能。
ffmpeg -i original.jpg -i original-removebg-preview.png -filter_complex [0:v]format=rgba[ori];[1:v]zscale=foo:bar:f=spline36[alpha];[ori][alpha]lut2=x:x:x:y output.png

Zライブラリを使ったリサイズフィルタ zscale
2入力の LUT を手軽に入れ替えられる lut2

ハードウェアデコーダ、フィルタ、エンコーダを組み合わせる

$
0
0

デコーダにはQSV、DXVA2、D3D11、NVDEC。フィルタにはQSV、OpenCL、NPP。エンコーダにはQSVとソフトウェアエンコーダのlibx264のコマンド例のまとめ。コマンド例はぞれぞれ上にQSV、下にlibx264を併記し、filter はソフトウェアフィルタ(いわゆる通常のフィルタ)を示す。他にも処理の速いコマンド例があるかもしれない。入力ファイルはH.264/AACを想定している。

HWAccelIntro – FFmpeg

QSV

QSV 対応の ffmpeg をつくる
QSV フィルタの詰め合わせ vpp_qsv

デコード

ffmpeg -hwaccel qsv -c:v h264_qsv -i input -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

CPUフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

QSVフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

QSVフィルタからCPUフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf scale_qsv=1280:720,hwdownload,format=nv12,filter,hwupload=extra_hw_frames=64 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからQSVフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter,hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter,hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタ
ffmpeg に nvenc(cuda)をインストールする
CUDA を使ったハードウェアアクセレーションフィルタのまとめ

ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタからCPUフィルタ

ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからNPPフィルタ

ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device cuda=cuda -filter_hw_device cuda -hwaccel qsv -c:v h264_qsv -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタ
opencl | ニコラボ

ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタからCPUフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからOpenCLフィルタ

ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

DXVA2

デコード

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -vf hwdownload -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -vf hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

CPUフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -vf hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -i input -vf hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

QSVフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

QSVフィルタからCPUフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからQSVフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタからCPUフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからNPPフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,scale=320:180,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,scale=320:180,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタからCPUフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからOpenCLフィルタ

ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

D3D11

デコード
-hwaccel_device で何番目のGPUを使うか指定している。

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -i input -vf hwdownload -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -i input -vf hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

CPUフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -i input -vf hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -i input -vf hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

QSVフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

QSVフィルタからCPUフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからQSVフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタからCPUフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからNPPフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device cuda=cuda -filter_hw_device cuda -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタからCPUフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからOpenCLフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 1 -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NVDEC(cuvid)

デコード

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

QSVフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

QSVフィルタからCPUフィルタ

ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -hwaccel_device 0 -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからQSVフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwdownload,format=nv12,scale=320:240,hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NPPフィルタからCPUフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからNPPフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input -vf hwdownload,format=nv12,filter,hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

OpenCLフィルタからCPUフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,hwupload,roberts_opencl,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからOpenCLフィルタ

ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -init_hw_device opencl=ocl:1.0 -filter_hw_device ocl -i input -vf hwdownload,format=nv12,filter,hwupload,roberts_opencl,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

NVDEC

デコーダ名の指定が不要。一部フィルタの併用方法が不明。

デコード

ffmpeg -hwaccel nvdec -i input -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel nvdec -i input -c:v libx264 -c:a copy output.mp4

CPUフィルタ

ffmpeg -hwaccel nvdec -i input -vf filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel nvdec -i input -vf filter -c:v libx264 -c:a copy output.mp4

QSVフィルタ

ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

QSVフィルタからCPUフィルタ

ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12,filter -c:v libx264 -c:a copy output.mp4

CPUフィルタからQSVフィルタ

ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf filter,hwupload=extra_hw_frames=64,scale_qsv=1280:720 -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel nvdec -init_hw_device qsv=qsv:hw -filter_hw_device qsv -i input -vf filter,hwupload=extra_hw_frames=64,scale_qsv=1280:720,hwdownload,format=nv12 -c:v libx264 -c:a copy output.mp4

任意のラウドネス値に音量を調整する loudnorm

$
0
0

目標となる LUFS とラウドネスレンジ、トゥルーピークを調整する loudnorm フィルタの使い方。1回の処理で行うのと、1回目の解析結果を使って2回の処理を行う方法の2種類がある。loudnorm フィルタを当てるとサンプリング周波数が192kHzにリザンプルされるので、-araresample フィルタで目標のサンプリング周波数を指定する。

基本コマンド

目標 LUFS を -14、トゥルーピークを -3、ラウドネスレンジを 4 にして、出力結果の要点をコンソールに表示。
ffmpeg -i input -af "loudnorm=I=-14:TP=-3:LRA=4:print_format=summary" -vn -f null -

1回で処理を終えるなら pan フィルタでチャンネル数を明示して aresample フィルタで目標のサンプリング周波数を指定する。以下は2チャンネルの48kHzの例で libsoxr でリザンプルしている。libsoxr を有効にしていないなら周波数だけを指定する。
ffmpeg -i input -af "loudnorm=I=-14:TP=-3:LRA=4:print_format=summary,pan=stereo|c0=FL|c1=FR,aresample=48000:resampler=soxr" -c:v copy output

1回目の解析結果を使って2回の処理を行う方法と要点の例。
ffmpeg -i input -af "loudnorm=I=-14:TP=-3:LRA=4:print_format=json" -vn -f null -

{
        "input_i" : "-8.18",
        "input_tp" : "1.10",
        "input_lra" : "4.40",
        "input_thresh" : "-18.22",
        "output_i" : "-13.44",
        "output_tp" : "-3.00",
        "output_lra" : "3.80",
        "output_thresh" : "-23.46",
        "normalization_type" : "dynamic",
        "target_offset" : "-0.56"
}

それぞれの input と offset の値をオプションで指定する。その結果 output の値が調整されている。
ffmpeg -i input -af "loudnorm=I=-14:TP=-3:LRA=4:measured_I=-8.18:measured_TP=1.1:measured_LRA=4.4:measured_thresh=-18.22:offset=-0.56:print_format=json,pan=stereo|c0=FL|c1=FR,aresample=48000:resampler=soxr" -c:v copy output

{
        "input_i" : "-8.18",
        "input_tp" : "1.10",
        "input_lra" : "4.40",
        "input_thresh" : "-18.22",
        "output_i" : "-13.99",
        "output_tp" : "-3.00",
        "output_lra" : "3.80",
        "output_thresh" : "-24.01",
        "normalization_type" : "dynamic",
        "target_offset" : "-0.01"
}

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

参考記事
オーディオコンテンツのラウドネス値の正規化 | Alexa Skills Kit
windows – ffmpeg to normalize loudness of a video – Stack Overflow

オプション

要点で表示される順番とオプション指定の順番が異なる。

  • I, i[double]
    目標のラウドネス値
    既定値:-24
    範囲:-70 から -5 まで
  • LRA, lra[double]
    目標のラウドネスレンジ
    既定値:7
    範囲:1 から 20 まで
  • TP, tp[double]
    トゥルーピークの最大値の指定
    既定値:-2
    範囲:-9 から 0 まで
  • measured_I, measured_i[double]
    測定した入力ファイルのラウドネス値
    既定値:0
    範囲:-99 から 0 まで
  • measured_LRA, measured_lra[double]
    測定した入力ファイルのラウドネスレンジ
    既定値:0
    範囲:0 から 99 まで
  • measured_TP, measured_tp[double]
    測定した入力ファイルのトゥルーピーク
    既定値:99
    範囲:-99 から 99 まで
  • measured_thresh[double]
    測定した入力ファイルの閾値
    既定値:-70
    範囲:-99 から 0 まで
  • offset[double]
    ゲインオフセット
    既定値:0
    範囲:-99 から 99 まで
  • linear[boolean]
    可能なら線形ノーマライズする
    既定値:1
  • dual_mono[boolean]
    入力ファイルをデュアルモノラルとして扱う
    既定値:0
  • print_format[int]
    解析結果を表示するフォーマット
    • 0, none:非表示。既定値
    • 1, json
    • 2, summary:小数点第2位は四捨五入

ARIB字幕をVTTにしてHLSで視聴する

$
0
0

現状の ffmpeg では VTT字幕と、映像と音声のセグメントを合わせたマスタープレイリストを作れないので、マスタープレイリストを編集しなければならない。多くのブラウザがプレイリストの直接再生に対応していないのでライブラリを使う。

ffmpeg で Apple HTTP Live Streaming(HLS)を扱う

準備

HTML5 プレイヤの例

ffmpeg で HLS 出力するときに注意する点はいくつかあり、エンコード設定、解像度やフレームレート、ライブかVODか、遅延、視聴環境などそれぞれに対応する必要があるが、今回は試しやすい Windows10 での Edge、firefox、Chrome で再生確認し、配信環境を nginx、ngrok で作っている。

nginx: download
ngrok – secure introspectable tunnels to localhost

ngrok 導入方法 – Qiita
少しでも安全にngrokを使用する(Basic認証) – Qiita

ARIB字幕を変換するには libaribb24 を有効にする。

ARIB字幕をdemuxする libaribb24

Windows 向けには お気に入りの動画を携帯で見よう の配布バイナリが対応している。

コーデックは H.264/AAC を使うので映像コーデックにはソフトウェアエンコード、ハードウェアエンコードそれぞれ配信環境に合わせて使う。AACエンコーダは配布できない FDK-AAC(libfdk-aac)があるので、こちらを試すなら media-autobuild_suite でバイナリを用意する。

通常のARIB字幕付きHLS配信

デュアルモノラルのときだけ音声コーデックを copy すると HLS で再生できない。それ以外はコピーしても再生できる(はず)。

[確認]NHK解説放送のmp4エンコード · Issue #244 · l3tnun/EPGStation

ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map a:0 -map 0:s -f hls -master_pl_name master.m3u8 -hls_list_size 0 720p.m3u8

一番メジャーなインターレース解除フィルタ yadif
リサイズする scale

これで出力されるプレイリストが、720p.m3u8、720p.m3u8 を参照する master.m3u8、720p_vtt.m3u8 になる。ただし master.m3u8 は sub_vtt.m3u8 を参照してないので以下のように書き換える。

書き換え前。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,CODECS="avc1.64001f,mp4a.40.2"
720p.m3u8

書き換え後。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="Japanese",DEFAULT=YES,AUTOSELECT=NO,FORCED=NO,LANGUAGE="jp",URI="720p_vtt.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,SUBTITLES="sub"
720p.m3u8

BANDWIDTH タグはビットレートの目安となり、DEFAULT, AUTOSELECT, FORCED タグは字幕の表示設定に関わる。GROUP-ID タグで指定したものを SUBTITLES タグで指定することでそのストリームに字幕を載せることができる。

VTT字幕付きで再生するには hls.js を使う。HLSを使って重い動画をWEBサイトに実装する – Qiita を参考に、html ファイルを作成して、hls.loadSource 内のプレイリストを master.m3u8 に変更する。参照している(https://cdn.jsdelivr.net/npm/hls.js@latest)は Releases · video-dev/hls.js の hls.min.js と同じである。

これで最初から字幕付きのHLSで再生できる。最初から字幕を非表示にするには DEFAULT, AUTOSELECT, FORCED を無指定にしておく。

映像と音声のプレイリストと字幕のプレイリストを出力し、マスタープレイリストを出力せずに自作するコマンド例。マスタープレイリストは上と同じ。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map 0:a -map 0:s -f hls -hls_list_size 0 720p.m3u8

fmp4 に変更する

上のコマンド例に -hls_segment_type 1 を追加する。
ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map a:0 -map 0:s -f hls -master_pl_name master.m3u8 -hls_list_size 0 -hls_segment_type 1 720p.m3u8

ffmpeg -analyzeduration 10MB -probesize 10MB -fix_sub_duration -i input.ts -vf yadif,scale=1280:720 -c:v libx264 -c:a aac -c:s webvtt -map 0:v -map 0:a -map 0:s -f hls -hls_list_size 0 -hls_segment_type 1 720p.m3u8

書き換え後。#EXT-X-VERSION:7 にする。

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub",NAME="Japanese",DEFAULT=YES,AUTOSELECT=NO,FORCED=NO,LANGUAGE="jp",URI="720p_vtt.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=140800,RESOLUTION=1280x720,SUBTITLES="sub"
720p.m3u8

映像の特定領域だけ品質を変える addroi

$
0
0

ゲーム配信などでレイアウトを決めるときに映像が全く変わらない部分。例えばRTAのチャートの部分とか、レトロゲームを模したフレームとかそういったところの品質を下げると他の部分で使えるビットレートが増えて全体の品質が向上する。対応コーデックは H.264、H.265、VP8、VP9 など。

Encode/H.264 – FFmpeg
Encode/H.265 – FFmpeg

VP9(libvpx-vp9)のエンコード設定について
新しい映像の品質評価 libvmaf

基本コマンド

左上0:0座標から右と下に100ピクセルの領域に0.2品質を悪くする。
ffmpeg -i input -vf addroi=x=0:y=0:w=100:h=100:qoffset=1/5 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output
ffmpeg -i input -vf addroi=0:0:100:100:1/5 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output

2回フィルタを当てれば2カ所の品質を変えられる。以下の例は左3分の1の品質を0.5良くし、右3分の1の品質を0.5悪くする。
ffmpeg -i input -vf addroi=0:0:iw/3:ih:-1/2,addroi=2*iw/3:0:iw/3:ih:1/2 -c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k -c:a copy output

コーデック別のオプション例。VP9 は ROI is only enabled when aq_mode is 0, cpu_used >= 5 and deadline is REALTIME となるので以下のようになる。-crf で品質指定しビットレート固定して品質の比較をしやすくしている。厳密にビットレートをそろえるなら2パスエンコード -pass 1、2するが VP8 は -crf が使えず、VP9 は -quality realtime で2パスエンコードができない。

-c:v libx264 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k
-c:v libx265 -crf 25 -b:v 800k -bufsize 800k -maxrate 800k
-c:v libvpx -crf 25 -b:v 800k -bufsize 800k -minrate 800k -maxrate 800k
-c:v libvpx-vp9 -aq-mode 0 -cpu-used 5 -quality realtime -crf 25 -b:v 800k -bufsize 800k -minrate 800k -maxrate 800k

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

オプション

領域指定はぴったりの範囲ではなく16の倍数で目的の範囲より一回り小さい値を指定する。qoffset の値は映像のビット深度で品質指定 crf の影響が異なり、10bit深度なら 51 から -12 までの範囲である(51 – – 12)の 63 を 1 とし、8bit深度では 51 から 0 までの範囲の (51 – 0)の 51 を 1 とする。単色で全く映像が変わらないなら qoffset=1 でよいが、色が複雑なら 0.2 くらいから調整してみる。

  • x[string]
    領域指定の横座標
  • y[string]
    領域指定の縦座標
  • w[string]
    指定範囲の横のピクセル数
  • h[string]
    指定範囲の縦のピクセル数
  • qoffset[rational]
    品質指定のオフセット値。マイナスほど高品質大容量
    既定値:-1/10
    範囲:-1 から 1 まで
  • clear[boolean]
    このフィルタの効果を打ち消す
    既定値:0

指定した色の色彩を残してそれ以外をグレーに変える colorhold

$
0
0

出力フォーマットは BGRA。アルファチャンネルは透過しない。

基本コマンド

緑を保持して他の色をグレーにする。
ffmpeg -i input -vf colorhold=color=green:similarity=0.5:blend=0 -vframes 1 output.jpg
ffplay -i input -vf colorhold=green:0.5:0

colorhold フィルタの効果比較

各チャンネルを左から並べる。
ffmpeg -i input -vf colorhold=green:0.5:0,extractplanes=r+g+b,hstack=3 -vframes 1 output.jpg

オリジナルとRGB各チャンネルを2×2で並べる。左上から右に向かってオリジナル、R、G、Bの順番。
ffmpeg -i input -vf "split[ori],colorhold=green:0.5:0,extractplanes=r+g+b,[ori]xstack=4:0_0|w0_0|0_h0|w0_h0" -vframes 1 output.jpg

各映像チャンネルを分離する extractplanes
解像度が一致しなくても映像を並べられる xstack

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

オプション

同じオプション設定に colorkey フィルタがあり、こちらは指定した色が透過する。

  • color[color]
    指定した色を保持し、その色以外はグレーになる。16進数形式か、色名を指定
    既定値:”black”
  • similarity[float]
    一致の範囲指定。0.01 は完全一致
    既定値:0.01
    範囲:0.01 から 1 まで
  • blend[float]
    似た色の影響具合、0 は指定した色だけで大きくするほど似た色も少しずつグレーになる
    既定値:0
    範囲:0 から 1 まで

複数ファイルの映像のピクセル中央値を返す xmedian

$
0
0

複数画像や映像の異なるフレームのピクセル中央値を返すことで長時間露光したような動く部分だけが消えて背景だけの映像が作れる。入力するファイル数や参照フレームを多くしたり、解像度やフレームレートが高いとそれだけ負荷も高くなる。

基本コマンド

3つの画像のピクセル中央値にした画像に変換。
ffmpeg -i img1.jpg -i img2.jpg -i img3,jpg -filter_complex xmedian=3 output.jpg

同じ動画は読み込み開始時間をずらす。以下は3秒と6秒ずらした例。異なる PTS の動画を合わせているので setpts フィルタでリセットしている。
ffmpeg -i video.mp4 -ss 3 -i video.mp4 -ss 6 -i video.mp4 -filter_complex xmedian=3,setpts=PTS-STARTPTS -c:a copy output.mp4

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

オプション

  • inputs[int]
    入力ファイル数
    既定値:3
    範囲:3 から 255 まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:15(すべてのチャンネル)
    範囲:0 から 15 まで

11の動画を使ったバッチファイル例。60秒間出力。

ffmpeg -i %1 -ss 3 -i %1 -ss 6 -i %1 -ss 9 -i %1 -ss 12 -i %1 -ss 15 -i %1 -ss 18 -i %1 -ss 21 -i %1 -ss 24 -i %1 -ss 27 -i %1 -ss 30 -i %1 -filter_complex "xmedian=11,setpts=PTS-STARTPTS" -c:a copy -t 60 %~d1%~p1%~n1-xmedian.mp4
pause

レナ (画像データ)をffmpegで使いやすいように加工する

$
0
0

レナ (画像データ) – Wikipedia

レナ(Lenna または Lena)とは、PLAYBOY誌1972年11月号に掲載された女性ヌード写真の一部。画像圧縮アルゴリズムのサンプルに、広く使用されている画像データである。

全身写真 400×855。
http://www.lenna.org/full/len_full.jpg

全身写真をカットして顔周辺の 192×192。
ffmpeg -i len_full.jpg -vf crop=192:192:96:12 lena-min1.jpg

胸も含めた 256×256。
ffmpeg -i len_full.jpg -vf crop=256:256:64:0 lena-min2.jpg

ffmpeg では胸が載っていない公開しやすい形で 256×256 にカットされている。
https://samples.ffmpeg.org/image-samples/lena.pnm

ffmpeg で公開してあるレナ画像

1フレーム内のメディアンフィルタ median

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。映像の指定したピクセル内のピクセル中央値を返すのでマスクしてデノイズするのに使える。マスクは colorkey、chromakey フィルタで作れる。

ffmpeg でクロマキー合成
ffmpeg でクロマキー合成 その2

複数ファイルの中央値を返すのなら xmedia フィルタを使う。

複数ファイルの映像のピクセル中央値を返す xmedian

基本コマンド

横方向に10ピクセル、縦方向に20ピクセルにすべてのチャンネルの中央値を返す。
ffmpeg -i input -vf median=radius=10:planes=15:radiusV=20:percentile=0.5 -c:a copy output
ffplay -i input -vf median=10:15:20:0.5

緑に colorkey フィルタを当てて緑以外をマスクして緑部分に median フィルタを当てている。比較用にマスクしない例も併記。
ffplay -f lavfi -i rgbtestsrc,median=1:15:59
ffplay -f lavfi -i rgbtestsrc,split[v],colorkey=green:0.5[ov];[v]median=1:15:59[bv];[bv][ov]overlay=format=rgb

オリジナルのrgbtestsrc
マスクしない median
マスクした median

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

オプション

半径オプションのピクセル数は入力した映像の縦横それぞれ4分の1引く1以下にする。

  • radius[int]
    フィルタを当てる横の半径
    既定値:1
    範囲:1 から 127 まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
  • radiusV[int]
    フィルタを当てる縦の半径
    既定値:0(0指定は radius と同じ値)
    範囲:0 から 127 まで
  • percentile[float]
    百分位数の指定。0.5 なら中央値。0 なら最小値。1 なら最大値
    既定値:0.5
    範囲:0 から 1 まで

映像を上下左右にスクロールする scroll

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。今までは stack フィルタで映像を並べて overlay フィルタで映像を動かしていたのが、scroll フィルタだけでスクロールできるようになった。出力フォーマットは GBRP なので適宜 format フィルタで出力形式に合わせて変換する。

基本コマンド

下から上に1フレーム毎に5%づつスクロールする。ffplay で再生確認するときは loop フィルタの size でループするフレーム数を指定する。

ループ回数を指定できる loop, aloop

ffmpeg -i input -vf scroll=vertical=0.05,format=yuv420p -c:a copy output
ffplay -i input -vf loop=loop=-1:size=32767,scroll=vertical=0.05,format=yuv420p

右から左の場合。
ffmpeg -i input -vf scroll=horizontal=0.05,format=yuv420p -c:a copy output
ffplay -i input -vf loop=loop=-1:size=32767,scroll=horizontal=0.05,format=yuv420p

画像をループする場合。
ffmpeg -loop 1 -i img -vf scroll=horizontal=0.05,format=yuv420p output
ffplay -i img -vf loop=loop=-1:size=1,scroll=horizontal=0.05,format=yuv420p

horizontalvertical を併用すると斜めにスクロールする。
ffmpeg -loop 1 -i img -vf scroll=horizontal=0.05:vertical=0.03,format=yuv420p output
ffplay -i img -vf loop=loop=-1:size=1,scroll=horizontal=0.05:vertical=0.03,format=yuv420p

loop フィルタの size を指定すると映像をループしながらスクロールも併用できる。25fpsのサンプル動画に10秒ループ(25×10=250)で1スクロールする。
ffmpeg -f lavfi -i testsrc2 -vf loop=loop=-1:size=250,setpts=N/(FRAME_RATE*TB),scroll=horizontal=1/250,format=yuv420p -t 10 output
ffplay -f lavfi -i testsrc2 -vf loop=loop=-1:size=250,scroll=horizontal=1/250,format=yuv420p

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

オプション

既定値のままだとスクロールしない。

  • horizontal, h[float]
    左右のスクロール速度の指定。プラスで右から左、マイナスで左から右になり。絶対値が大きいほど高速になる。指定値は1フレーム当たり移動する横解像度の割合
    既定値:0
    範囲:-1 から 1 まで
  • vertical, v[float]
    上下のスクロール速度の指定。プラスで下から上、マイナスで上から下になり。絶対値が大きいほど高速になる。指定値は1フレーム当たり移動する縦解像度の割合
    既定値:0
    範囲:-1 から 1 まで
  • hpos[float]
    スクロール開始する横座標の相対位置
    既定値:0
    範囲:0 から 1 まで
  • vpos[float]
    スクロール開始する縦座標の相対位置
    既定値:0
    範囲:0 から 1 まで

てんかん患者に配慮したシーンチェンジブラー photosensitivity

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。急激な輝度変化で明るくなるシーンチェンジにフレーム平均ブラーを掛けて輝度変化を緩やかにする photosensitivity(いわゆる光過敏性発作対策)フィルタの使い方。

ポケモンショック – Wikipedia

基本コマンド

既定値のコマンド例。
ffmpeg -i input -vf photosensitivity=frames=30:threshold=1:skip=1:bypass=0 -c :a copy output
ffplay -i input -vf photosensitivity=30:1:1:0

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

オプション

  • frames, f[int]
    フィルタに使うフレーム数
    既定値:30
    範囲:2 から 240 まで
  • threshold, t[float]
    ブラーになる閾値。小さな値ほど少しの輝度変化でブラーがかかる
    既定値:1
    範囲:0.1 から FLT_MAX まで
  • skip[int]
    フィルタの対象となったフレームのスキップするピクセル数。大きい値ほど平均するフレーム数が増える
    既定値:1
    範囲:1 から 1024 まで
  • bypass[boolean]
    フィルタを無効化する
    既定値:0

各チャンネルのノイズ係数を調べる bitplanenoise

$
0
0

YUV、RGB それぞれのチャンネルにどれくらいのノイズが含まれているか、0 から 1 までの範囲で調べられる bitplanenoise フィルタの使い方。ノイズ計数は 1 に近いほどノイズが多い。ログの表示に metadata、drawtext フィルタを使っている。

基本コマンド

最初のチャンネルのノイズを3チャンネルに分解して noise.txt に出力する。
ffmpeg -i input -vf bitplanenoise=bitplane=1,metadata=mode=print:file=noise.txt -an -f null -

出力例。bitplanenoise.チャンネル番号.該当チャンネル番号 の順になる。

frame:0    pts:0       pts_time:0
lavfi.bitplanenoise.0.1=0.827908
lavfi.bitplanenoise.1.1=0.791910
lavfi.bitplanenoise.2.1=0.736319

テキストファイルではなくコンソールに出力する。
ffmpeg -i input -vf bitplanenoise=bitplane=1,metadata=mode=print:file=- -an -f null -

ノイズをわかりやすくして再生する。
ffplay -i input -vf bitplanenoise=bitplane=1:filter=1

各チャンネルのノイズを vstack フィルタを使って縦に3つ並べる。順番は上から下にYUV。
ffplay -i input -vf format=yuv444p,bitplanenoise=bitplane=1:filter=1,extractplanes=y+u+v,vstack=3

YUV420 の映像の場合。
ffplay -i input -vf bitplanenoise=bitplane=1:filter=1,extractplanes=y+u+v[y][u][v];[u][v]vstack=2,[y]hstack=2

drawtext フィルタを使って映像上にノイズ係数を描写する。
ffplay -i input -vf bitplanenoise,drawtext=y=40:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"noise 0.1 "%{metadata\:lavfi.bitplanenoise.0.1}',drawtext=y=60:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"noise 1.1 "%{metadata\:lavfi.bitplanenoise.1.1}',drawtext=y=80:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"noise 2.1 "%{metadata\:lavfi.bitplanenoise.2.1}'

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

オプション

エッジ保持のスムースフィルタ bilateral

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。軽めにフィルタを当てるとエッジ保持してノイズをうまく消せるが、既定値以上の設定だと細部が消えて油絵のような効果になる bilateral フィルタの使い方。

基本コマンド

既定値のオプション内容。
ffmpeg -i input bilateral=sigmaS=0.1:sigmaR=0.1:planes=1 -c:a copy output
ffplay -i input bilateral=0.1:0.1:1

crop、hstack、scale、bitplanenoise フィルタを併用してノイズの減り具合を再生して比べ。左半分に bilateral フィルタが当たっていて、右半分はオリジナルのまま。解像度を2倍して4等分した左上を4つ並べている。
ffplay -i input -vf split=2[b],bilateral=sigmaS=0.02:sigmaR=0.03:planes=1,crop=iw/2:ih/2:0:0[a];[b]crop=iw/2:ih/2:0:0,[a]hstack=2,scale=2*iw:-2:flags=neighbor,split=2[c],bitplanenoise=filter=1,[c]vstack=2

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

オプション

  • sigmaS[float]
    空間の重みを計算するガウス関数のシグマを設定
    既定値:0.1
    範囲:0 から 10 まで
  • sigmaR[float]
    範囲の重みを計算するガウス関数のシグマを設定。この数値を上げると複雑な部分が一層ぼやける
    既定値:0.1
    範囲:0 から 1 まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:1
    範囲:0 から 1 まで

エッジ保持のブラーフィルタ yaepblur

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。アルゴリズムについては、”J. S. Lee, Digital image enhancement and noise filtering by use of local statistics, IEEE Trans. Pattern Anal. Mach. Intell. PAMI-2, 1980.” を参照。yaepblur は “yet another edge preserving blur filter” という意味。bilateral フィルタよりも薄くブラーを掛けられるので調整しやすい。

引用論文:ファジィと画像パターン認識:ci.nii.ac.jp

基本コマンド

既定値のオプション内容。
ffmpeg -i input yaepblur=radius=3:planes=1:sigma=128 -c:a copy output
ffplay -i input yaepblur=3:1:128

フィルタ比較。左がフィルタを当てている。
ffplay -i input -vf split[B],yaepblur=3:1:128,crop=iw/2:ih/2:0:0[Av];[B]crop=iw/2:ih/2:0:0,[Av]hstack,scale=2*iw:-2:flags=neighbor,split[C],bitplanenoise=filter=1,[C]vstack

2つフィルタを当てて右にオリジナル。左からABCの順番。
ffplay -i input -vf split=3[B][C],yaepblur=63:1:128,crop=iw/2:ih/2:0:0[Av];[B]yaepblur=63:1:256,crop=iw/2:ih/2:0:0[Bv];[C]crop=iw/2:ih/2:0:0,[Av][Bv]hstack=3,scale=2*iw:-2:flags=neighbor,split[D],bitplanenoise=filter=1,[D]vstack

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

オプション

  • radius, r[int]
    window の半径の指定。大きな値ほどフィルタの影響が小さくなる
    既定値:3
    範囲:0 から INT_MAX まで
  • planes, p[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:1
    範囲:0 から 1 まで
  • sigma, s[int]
    ブラー強度の指定
    既定値:128
    範囲:1 から INT_MAX まで

ニコニコのコメントを表示する AviSynth プラグイン AviSynthNicoComment

$
0
0

ニコニコ動画やニコニコ生放送のコメントを映像の上にオーバーレイ表示するプラグイン。アンケートの表示は対応予定。ue shita big small などのコマンドは未対応。ffmpeg は --enable-avisynth で avisynth に対応し、--enable-vapoursynth で vapoursynth に対応している。avisynth は多くの配布バイナリで対応しているが、vapoursynth の対応バイナリはおそらく配布していない。

hetima/AviSynthNicoComment: ニコ生のコメントを表示する AviSynth プラグインです。

avisynth の利用環境をそろえる

AviSynthPlus 本体のダウンロード。Assets から、インストーラーか、filesonlyを使う。
Releases · AviSynth/AviSynthPlus

filesonly を使うなら「2019 用 Visual C++ 再頒布可能パッケージ」をインストールして再起動する。通常は「x64: vc_redist.x64.exe」をダウンロード。
最新のサポートされる Visual C++ のダウンロード

入力プラグイン L-SMASH-Works をダウンロード。
Releases · HolyWu/L-SMASH-Works

コメント表示して再生する

ffmpeg.exe、AviSynth.dll、LSMASHSource.dll、movie.mp4、comment.xml を同じ場所において、input.avs を例に以下のように記述する。

LoadPlugin("LSMASHSource.dll")
LoadPlugin("AviSynthNicoComment.dll")
videoPath = "movie.mp4"
commentPath = "comment.xml"
src = LSMASHVideoSource(videoPath)
video = AudioDub(src, LSMASHAudioSource(videoPath))
comment = NicoComment(video, file=commentPath, row=48, shift=0)
Overlay(video, comment, mask=comment.ShowAlpha("rgb"))

ファイルは H.264/AAC の MP4 を入力する。ニコニコ生放送のデータは TS ファイルなので MP4 に入れ替える。
ffmpeg -i input.ts -c copy movie.mp4

再生コマンド。
ffplay -i input.avs

ffmpeg のフィルタで倍速再生する。
ffplay -i input.avs -vf setpts=(PTS-STARTPTS)/2 -af atempo=2

倍速再生するなら。setpts、atempo フィルタなどを使う。
映像と音声の pts を扱う setpts, asetpts

絶対値の差の大きい小さいを返す maskedmax, maskedmin

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。3つの映像から1入力目と比較し絶対値の大きい、小さいほうのピクセル値を返す maskedmax、maskedmin フィルタの使い方。

基本コマンド

効果がわかりやすいように lutyuv フィルタでピクセル値を変更している。以下の例でオリジナルのYUVのピクセル値が+5、+10、-10になる。プラスとマイナスで同じ絶対値になったときはピクセル値の大きい方を返す。便宜上入力ファイル名を変えているが同じファイルとする。
ffmpeg -i input1 -i input2 -i input3 -filter_complex [1:v]lutyuv=val+5:val+10:val-5[1v];[2:v]lutyuv=val-5:val+5:val-10[2v];[0:v][1v][2v]maskedmax -c:a copy output

一度しかファイルを入力しないのなら。
ffmpeg -i input -filter_complex split=3[1][2][3];[1]lutyuv=val+5:val+10:val-5[1v];[2]lutyuv=val-5:val+5:val-10[2v];[3][1v][2v]maskedmax -c:a copy output

以下の例でオリジナルのYUVのピクセル値が+5、+5、-5になる。
ffmpeg -i input1 -i input2 -i input3 -filter_complex [1:v]lutyuv=val+5:val+10:val-5[1v];[2:v]lutyuv=val-5:val+5:val-10[2v];[0:v][1v][2v]maskedmin -c:a copy output

コンソール上でピクセル値を調べる例。ピクセルフォーマットはGBRPなので、順番にGreen、Blue、Redの順番になる。mean:[110 110 90]と表示され、RGBでは(90:110:110)になる。
ffmpeg -f lavfi -i color=s=4x4:d=1,lutrgb=100:100:100 -f lavfi -i color=s=4x4:d=1,lutrgb=90:95:110 -f lavfi -i color=s=4x4:d=1,lutrgb=105:110:90 -filter_complex maskedmax,showinfo -vframes 1 -f null -

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

オプション

planes
フィルタを当てるチャンネル指定。フィルタが当たらなければ1入力目がそのまま出力される。詳しくは ffmpeg について | チャンネルの順番と注意点 を参照。
既定値:15(すべてのチャンネル)

コントラストに応じたシャープフィルタ cas

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。cas は “Contrast Adaptive Sharpen” の略。似たフィルタに unsharp がある。

基本コマンド

既定値だと strength=0 なのでフィルタの影響がない。
ffmpeg -i input -vf cas=strength=0:planes=7 -c:a copy output
ffplay -i input -vf cas=0:7

ノイズ係数の変化を bitplanenoise フィルタで調べる。ブラーフィルタは一般的には数値が小さくなるが、シャープフィルタは一般的には高くなる。左の映像に cas フィルタを当てて、右の映像は元の映像のまま左半分の映像を横に並べている。
ffplay -i input -vf split[2],cas=0.5:7,bitplanenoise=7,crop=iw/2:ih:0:0,drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:line_spacing=2:textfile=bitplanenoise_drawtext.txt[l];[2]bitplanenoise=7,crop=iw/2:ih:0:0,drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:line_spacing=2:textfile=bitplanenoise_drawtext.txt[r];[l][r]hstack

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

オプション

  • strength[float]
    フィルタの強度指定
    既定値:0
    範囲:0 から 1 まで
  • planes[flags]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:7(3つのチャンネル全部)
    範囲:0 から 15 まで

映像のトランジションの設定ができる xfade

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。映像の切り替えにフェード、スライド、ワイプ、ディゾルブなどのトランジションを追加する xfade フィルタの使い方。1つめの映像の最後につなげるフィルタとは限らず、指定時間から指定時間秒トランジションを行う。

関連フィルタ
フェードイン、フェードアウトの設定ができる fade

基本コマンド

映像を xfade フィルタでクロスフェードし、音声もクロスフェードするには afade、asetpts、amix フィルタを併用する。xfade フィルタの offsetafade フィルタの st を同じ値にし、xfade フィルタの durationafade フィルタの d を同じ値にすると映像のフェードと音声のフェードが同じように変化する。
ffmpeg -i input1 -i input2 -filter_complex [0:v][1:v]xfade=transition=fade:duration=1:offset=2[v];[0:a]afade=t=out:st=2:d=1,asetpts=PTS-STARTPTS[0a];[1:a]afade=t=in:st=2:d=1,asetpts=PTS-STARTPTS[1a];[0a][1a]amix[a] -map [v] -map [a] output

オプション

2つの映像は同じ解像度、フレームレート、タイムベースでなければならない。タイムベース変更は settb フィルタを使う。

  • transition[int]
    トランジションの指定
    • -1, custom
    • 0, fade。既定値
    • 1, wipeleft
    • 2, wiperight
    • 3, wipeup
    • 4, wipedown
    • 5, slideleft
    • 6, slideright
    • 7, slideup
    • 8, slidedown
    • 9, circlecrop
    • 10, rectcrop
    • 11, distance
    • 12, fadeblack
    • 13, fadewhite
    • 14, radial
    • 15, smoothleft
    • 16, smoothright
    • 17, smoothup
    • 18, smoothdown
    • 19, circleopen
    • 20, circleclose
    • 21, vertopen
    • 22, vertclose
    • 23, horzopen
    • 24, horzclose
    • 25, dissolve
    • 26, pixelize
    • 27, diagtl
    • 28, diagtr
    • 29, diagbl
    • 30, diagbr
  • duration[duration]
    トランジション効果が継続する秒指定
    既定値:1
  • offset[duration]
    トランジションが開始する秒指定
    既定値:0
  • expr[string]
    評価式の指定。オプションは後述。扱い方が難しい

expr のオプション

geq フィルタを参考にするがよくわからない。

  • X, Y
    入力映像の横と縦の解像度で 0 からはじまり W, H までを返す
  • W, H
    入力映像の横と縦の解像度。固定値
  • P
    Progress of transition effect.
  • PLANE
    Currently processed plane.
  • A
    Return value of first input at current location and plane.
  • B
    Return value of second input at current location and plane.
  • a0(x, y), a1(x, y), a2(x, y), a3(x, y)
    Return the value of the pixel at location (x,y) of the first/second/third/fourth component of first input.
  • b0(x, y), b1(x, y), b2(x, y), b3(x, y)
    Return the value of the pixel at location (x,y) of the first/second/third/fourth component of second input.

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

トランジションのサンプル

公式wikiにサンプルGIFが掲載されているのでそれを引用する。

distance だけフレーム数が異なるので別ファイル扱いにしている。

Viewing all 310 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>