ニコ動関係の情報と動画制作に関わるソフトウェアやウェブサービスと気になった事などを紹介します。
FMLE 3.2 | XSplit 2.x | NLE 2.0.2 | FFmpeg | OBS | |
料金 | 無料 | 有料と無料 | 無料*1 | 無料 | 無料 |
VP6 | ◯ | × | × | × | × |
H.263 | × | × | × | ◯ | × |
H.264 | ◯ | ◯ | ◯ | ◯ | ◯ |
QSV | × | ◯ | × | ◯ | ◯ |
NVENC | × | ◯ | × | ◯ | ◯ |
VCE | × | ◯ | × | × | × |
MP3 | ◯ | × | × | ◯ | ◯ |
AAC-LC | 有料 | 無料*2 | ◯ | ◯ | ◯ |
HE-AAC | 有料 | × | × | ◯*3 | × |
Nellymoser | × | × | × | ◯ | × |
Speex | × | × | × | ◯ | × |
ビットレート設定 | 任意 | 任意 | 任意 | 任意 | 任意 |
fps変更 | 1から60 | 無料は30まで | 任意 | 任意 | 任意 |
インターレース解除 | ◯ | ◯ | ◯ | ◯ | ◯ |
アスペクト比設定 | ◯ | ◯ | ◯ | ◯ | ◯ |
トリミング | ◯ | ◯ | ◯ | ◯ | ◯ |
プリセット書き換え | ◯ | ◯ | ◯ | ◯ | ◯ |
音量切替 | ◯ | ◯ | ◯ | ◯*4 | ◯ |
映像だけ配信 | ◯ | × | ◯ | ◯ | × |
音声だけ配信 | ◯ | × | × | ◯ | × |
複数サイト配信 | 2つまで | 有料 | ニコ生のみ | ◯ | × |
配信データ保存 | ◯ | ◯ | 配信データだけ | ◯*5 | ◯ |
配信ログ出力 | ◯ | × | × | ◯ | × |
ドロップ数表示 | ◯ | ◯ | × | ◯ | ◯ |
メディアファイル再生 | × | ◯ | ◯ | ◯ | ◯ |
画像表示 | × | ◯ | ◯ | ◯ | ◯ |
テキスト表示 | × | ◯ | ◯ | ◯ | ◯ |
video = DirectShowSource ("ndc.grf", fps=20, audio=false, framecount=36000).BilinearResize(512,288)
audio = DirectShowSource ("mic.grf", fps=20, video=false, framecount=36000)
AudioDub (video, audio)
ffplay input.avs
Option | Memo |
vn | 指定すると映像無効化 |
an | 指定すると音声無効化 |
vcodec | 映像コーデックの指定 c:v でも可能 |
acodec | 音声コーデックの指定 c:a でも可能 |
f | 入力・出力のフォーマット指定 |
y | 同じファイル名があったら上書き |
re | コピー配信やファイル配信する場合につける |
r | fps フレームレートを下げるときにつける |
s | 解像度 リサイズするときにつける 横x縦 |
loop | 静止画から動画を作るときにつける |
nr | ノイズリダクション デフォルトは 0, 100 から 1000 を指定 |
ss | エンコード開始時間 hh:mm:ss(時間:分:秒) 形式、または s(秒) で指定 -i より前に設定する。詳しくはこれ(英語) |
t | エンコード終了時間 hh:mm:ss(時間:分:秒) 形式、または s(秒) で指定 ss と t を併用すると ss で指定したところから t の時間分だけ出力する -i より後に設定する |
frames | 初めからのエンコード終了フレーム数 s と併用できない、t と併用すると時間の短いほうで終わる |
fs | 映像と音声があれば映像の容量を、音声だけなら音声の容量(bytes)指定 その動画容量でストップするもので指定容量に合わせてビットレートを合わせるものではない |
rtbufsize | バッファエラーが多発する場合に 100MB などを指定する |
-vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m"
This option is functionally the same as the x264opts, but is duplicated for compatibility with the Libav forkより、x264opts から x264-params に変更した。
-x264-params
を使う。注意点は一部使えないオプションがある。使えないオプションは、direct、min-keyint=auto、profile
。なので direct
は-direct-pred
のffmpegのオプションを使い、-x264-params min-keyint
は実数を指定し、profile
は -vcodec libx264 -vprofile main
などと指定する。ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -pix_fmt yuv420p -vcodec libx264 -x264-params 8x8dct=1:aq-mode=2:bframes=1:deblock=0,0:direct=auto:ipratio=1.41:keyint=240:level=3.1: me=hex:merange=16:min-keyint=24:mixed-refs=1:no-mbtree=0:partitions=all:psy-rd=0.5,0.0:qcomp=0.6:qpmax=51:qpmin=10:qpstep=4:ratetol=10:rc-lookahead=30:ref=2:subme=7:scenecut=40:threads=0:trellis=2: weightb=1:weightp=2:colormatrix=smpte170m -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 80k -f flv rtmp://...
crf=25
(XSplitでは品質10)を指定していた場合にffmpegでも同じエンコード設定にして crf=25
を指定しても同じようなビットレートで配信できないことが多い。よって crf
の値を小さくするか maxrate
を上げる。(1) -me_range 0
(2) -qdiff 3
(3) -g 12
(4) -qmin 2
(5) -qmax 31
(6) -qcomp 0.5
(7) -i_qfactor 0.8
(8) -b_qfactor 1.25
(9) -partitions 指定なし、かつ -subq 8
(1)~(9)のうち、5つ以上デフォルト値の場合にエラーで終了します。
コーデック名 | オプション名 |
Speex | libspeex |
Nellymoser | nellymoser |
MP3 | libmp3lame |
AAC-LC | aac libfdk_aac |
HE-AAC | libfdk_aac |
HE-AAC v2 | libfdk_aac |
オプション名 | 意味 | 使い方例 |
ab | 固定ビットレート | 64k or 640000 |
ac | チャンネル数 | 1 (mono) or 2 (stereo) |
an | 音声無効 | 1 (sound_off) |
aq | 可変ビットレート | 0~9 0が高品質 |
ar | 周波数(kHz) | 16000, 22050, 32000, 44100, 48000 |
vol | ボリューム | 256がデフォルト、512で2倍の約+6dB 現在は廃止され代わりにvolumeフィルタを使う |
周波数(kHz) | チャンネル数 | ビットレート(kb/s) | |
Speex | 16 | 1 | 8~36 |
HE-AAC v2 | 22.05~44.1 | 2 | 12~48 |
Nellymoser | 22.05 | 1 | 36~48 |
MP3 | 22.05 | 1 | 48~64 |
HE-AAC v1 | 44.1 | 2 | 48~80 |
MP3 | 44.1 | 1 or 2 | 64~80 |
MP3 | 44.1 | 2 | 80~320 |
AAC-LC | 44.1 | 2 | 128~320 |
-acodec libspeex -ac 1 -ar 16000 [-ab **k or -ap *]
-acodec nellymoser -ac 1 -ar [11025 or 22050 or 44100] -ab **k
-acodec libmp3lame -ar 44100 [-ab **k or -ap *]
-acodec aac -profile:a -ab **k -ar 44100 -aac_coder twoloop
-acodec libfdk_aac -profile:a [aac_low or aac_he or aac_he_v2] -ab **k -ar 44100
オプション名 | 優先度 |
/high | 高 |
/abovenormal | 通常以上 |
/normal | 通常 |
/belownormal | 通常以下 |
/low | 低 |
start /high ffmpeg ... 以下略
-s(-vf scale)
が使われるが、リサイズのオプションも変更することができ、何も指定しないと bicubic
でリサイズされる。accurate_rnd
は他のオプションに前につけて + でつなげる。すると少しssim値が大きくなる(リサイズをシャープにしない)。シャープになるほどcrfを固定してエンコードした映像のビットレートは高くなり、ssim値は小さくなる。3Dの複雑な映像ほどシャープにするとビットレート制限化ではビットレートが足りなくなるので、適宜リサイズオプションを変えてみて自分の配信に最適なオプションを探す。オプション名 | メモ |
accurate_rnd+bilinear | ぼんやり |
bilinear | ぼんやり |
experimental | ややぼんやり |
bicubic | ややシャープ |
spline | ややシャープ |
accurate_rnd+lanczos | シャープ |
lanczos | シャープ |
"scale=640:-1:flags=lanczos"
ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -sws_flags lanczos -s 512x288 -vcodec libx264 -crf 27 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m" -acodec aac -ar 44100 -ab 80k -f flv rtmp://...
ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -sws_flags lanczos -vf "scale=512:-1" -vcodec libx264 -crf 27 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m" -acodec aac -ar 44100 -ab 80k -f flv rtmp://...
-f dshow -audio_buffer_size 40 -i audio="XSplitBroadcaster"
-rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -f dshow -audio_buffer_size 40 -i audio="mic (UAB-80)" -filter_complex "amix" -pix_fmt yuv420p
-vcodec flv -b:v 300k -q:v 20
"C:WINDOWSSystem32cmd.exe"
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f fifo -fifo_format flv -map 0:v -map 0:a -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://live-tyo.twitch.tv/app/live_12345678_d9avhDuqU8rDJe40SrrHUd9rHJDae9
ffmpeg -list_options true -f dshow -i video="SCFF DirectShow Filter"
ffmpeg -list_options true -f dshow -i audio="ステレオ ミキサー (Realtek High Definit"
ffmpeg -rtbufsize 100MB -s 640x360 -r 24 -f dshow -i video="SCFH DSF"
ffmpeg -rtbufsize 100MB -f dshow -video_size 640x360 -framerate 24 -pixel_format yuv420p -i video="SCFF DirectShow Filter"
video = DirectShowSource ("avc.grf", fps=30, audio=false, framecount=54000)
audio = DirectShowSource ("aac.grf", fps=30, video=false, framecount=54000)
AudioDub (video, audio)
video = DirectShowSource ("avc.grf", fps=30, audio=false, framecount=54000)
audio = DirectShowSource ("mic.grf", fps=30, video=false, framecount=54000)
AudioDub (video, audio)
ffmpeg -rtbufsize 100MB -vsync passthrough -frame_drop_threshold 4 -f dshow -video_size 640x360 -framerate 24 -pixel_format yuv420p -i video="SCFF DirectShow Filter"
<outputsize value="320x240,384x216,448x336,480x360,512x288,512x384, 以下略" />
ffmpeg -re -i "input.mp4" -codec copy -f flv rtmp://...
ffmpeg -re -i "input.mp4" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://...
ffmpeg -re -i "input.mp4" -vn -acodec copy -f flv rtmp://...
ffmpeg -re -i "http://hoge.net/huga.mp4" -codec copy -f flv rtmp://...
ffmpeg -f dshow -i audio="AmaRec Core Audio Capture" -acodec aac -ar 44100 -ab 128k -f flv rtmp://...
ffmpeg -i "ndc.avs" -x264-params "colormatrix=smpte170m" -vn -acodec aac -ar 44100 -ab 128k -f flv rtmp://...
dshow
読み込みがオススメ。デバイス名はffmpegのコマンドから調べる。dshow
読み込みはできないかもしれない。ffmpeg.exe -list_devices true -f dshow -i dummy
ffmpeg -re -loop 1 -r 30 -i input.jpg -f dshow -i audio="AmaRec Core Audio Capture" -pix_fmt yuv420p -vcodec libx264 -vprofile main -bf 0 -g 300 -me_method dia -rc-lookahead 0 -refs 2 -subq 1 -x264-params "colormatrix=smpte170m" -threads 1 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://...
chcp 65001
を打って文字コードをUTF-8にする。元に戻すには chcp 932
と打つ。これで日本語のデバイスも dshow
で読み込めるようになる。rtmpdump.exe -vr "rtmp://... 略 -m 10 -o -
rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -f flv -i - -codec copy -f flv rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -f flv -i - -codec copy -f flv "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -f flv -i - -r 20 -s 512x288 -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://...
-vf "pad=max(iw,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2,scale=-1:240"
rtmpdump -vr "rtmp://ulraa11.live.nicovideo.jp:1935/liveedge/live_141128_10_0/lv123" -C S:"151356:lv123:0:1416534982:6171c0265f8845b3" -N "rtmp://nlpoca214.live.nicovideo.jp:1935/publicorigin/141128_10_0/,lv?123:a380fc070def99f2" -m 10 -o - | ffmpeg -f flv -i - -c copy -bsf:v h264_mp4toannexb -f mpegts "udp://localhost:8080"
rtmpdump -vr "rtmp://ulraa12.live.nicovideo.jp:1935/liveedge/live_141128_10_0/lv124" -C S:"151356:lv124:0:1416534982:6171c0265f8845b4" -N "rtmp://nlpoca214.live.nicovideo.jp:1935/publicorigin/141128_10_0/,lv?124:a380fc070def99f3" -m 10 -o - | ffmpeg -f flv -i - -c copy -bsf:v h264_mp4toannexb -f mpegts "udp://localhost:8081"
ffmpeg -f mpegts -i "udp://localhost:8080" -f mpegts -i "udp://localhost:8081" -filter_complex "[0:0]pad=iw:ih*2[up];[up][1:0]overlay=x=0:y=h;[0:1]pan=stereo|c0=c0+c1[a];[1:1]pan=stereo|c1=c0+c1[b];[a][b]amix"
ffmpeg -f mpegts -i "udp://localhost:8080" -f mpegts -i "udp://localhost:8081" -filter_complex "[0:0]crop=iw/2:ih:iw/2:0[r];[r][1:0]overlay=W/2:0;[0:1]pan=stereo|c0=c0+c1[a];[1:1]pan=stereo|c1=c0+c1[b];[a][b]amix"
ffmpeg -f flv -i "rtmp://nlakmjpk.live.nicovideo.jp:1935/live/ikw_CLR_11@s35862?auth=dbEaJbqd.aQaIaVdMdncAc5aQcObQdZdJaF-brjFtU-frG-vga-BvEDzo_wBACmC&aifp=0191210 live=1" -r 20 -s 512x288 -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://...
ffmpeg -rtbufsize 100MB -f dshow -video_size 960x488 -framerate 30 -i video="SCFF DirectShow Filter" -vf "crop=656:432:12:9"
ffmpeg -rtbufsize 100MB -f dshow -video_size 960x488 -framerate 30 -i video="SCFF DirectShow Filter" -vf "crop=640:432:20:9"
ffmpeg -rtbufsize 100MB -f dshow -video_size 960x488 -framerate 30 -i video="SCFF DirectShow Filter" -vf "crop=656:384:12:62"
ffmpeg -rtbufsize 100MB -f dshow -video_size 960x488 -framerate 30 -i video="SCFF DirectShow Filter" -vf "crop=640:384:20:62"
ffmpeg -re -i input.flv -vsync passthrough -frame_drop_threshold 4 -map 0:0 -map 0:1 -flags +global_header -c copy -f tee "[f=flv:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch|E:\output.flv"
#user nobody;
worker_processes 1;
error_log logs/error.log crit;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
access_log logs/rtmp_access.log;
ping 30s;
ping_timeout 10s;
drop_idle_publisher 15s;
application multi {
live on;
meta copy;
wait_video on;
allow publish 127.0.0.1;
allow publish 192.168.0.0/16;
allow publish 172.16.0.0/12;
allow publish 10.0.0.0/8;
deny publish all;
allow play 127.0.0.1;
allow play 192.168.0.0/16;
allow play 172.16.0.0/12;
allow play 10.0.0.0/8;
deny play all;
push rtmp://live-tyo.twitch.tv/app/ive_78062090_12s6uyK9qEtTQhvqY10gUlGdoKFCrv;
}
}
}
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 84k -f flv rtmp://localhost/multi
ffmpeg -i rtmp://localhost/multi -c copy -f flv rtmp://(以下略
"H:FFML_v0.0.1.15.7.For.NET4.5ffmpeg.exe" -i rtmp://localhost/multi -c copy -f flv ${RTMPTONICO}
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777 -vcodec libx264 -crf 27 -maxrate 1000k -bufsize 1500k 略 -acodec libmp3lame -ar 44100 -ab 96k -f flv "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv pipe: | ffmpeg -f flv -r 20 -i - -codec copy -f flv rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777 -codec copy hoge.flv
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv pipe: | ffmpeg -f flv -r 20 -i - -codec copy -f flv rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777 -codec copy -f flv "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://localhost:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777 -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 1000k -bufsize 2000k -acodec libmp3lame -ar 44100 -ab 128k -f flv "rtmp://localhost:1934/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
ffmpeg -re -i input.flv -vsync passthrough -frame_drop_threshold 4 -map 0:0 -map 0:1 -flags +global_header -c copy -f tee "[f=flv]rtmp://ニコ生|[f=mpegts]udp://localhost:8080"
ffmpeg -rtbufsize 100MB -f dshow -i video="devise_name":audio="devise_name" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 128k tmp.flv
ffmpeg -re -i tmp.flv -copy -f flv rtmp://...
ffmpeg -itsoffset -15 -rtbufsize 100MB -f dshow -i video="devise_name":audio="devise_name" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 128k -f flv rtmp://...
rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
rtmp://localhost/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 64k -f flv rtmp://localhost/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
-f dshow
で読み込む場合に XSplit の v2.0 では既定値が NV12 になっているが、出力オプションに -x264-params "colormatrix=smpte170m" を付けることで正しい色が表示される。ニコ生では配信時に YUV422 を指定すると10秒ほどでエラーが発生するので出力時にピクセルフォーマット -pix_fmt yuv420p
を必ず指定する。2013年2月以降の ffmpeg では NDC, SCFH DSF も何も指定しないと YUV444 で出力するようになったので -pix_fmt yuv420p
を必ず指定する。.ConvertToYUY2(matrix="rec709")
ImageSource("img.png", 0, 200, 20).ConvertToYUV2(matrix="rec709")
ffmpeg -i "img.avs" -x264-params "colormatrix=bt709" -vcodec libx264 -crf 1 output.flv
original_img | img_420 | img_422 | XSplit_420 | ||||
16.16.180 | 255.0.0 | 18.14.180 | 252.0.3 | 15.15.179 | 255.0.0 | 15.16.178 | 252.0.0 |
180.16.16 | 0.255.0 | 179.15.18 | 3.253.5 | 180.16.15 | 0.255.1 | 178.17.14 | 0.254.0 |
180.16.180 | 0.0.155 | 181.15.180 | 3.0.252 | 179.16.178 | 0.0.254 | 179.16.178 | 0.1.252 |
16.180.16 | 255.255.0 | 18.178.20 | 255.253.9 | 15.179.16 | 254.255.0 | 14.180.15 | 254.254.0 |
16.180.180 | 255.0.255 | 21.177.181 | 255.0.255 | 16.180.179 | 255.0.253 | 14.180.178 | 252.0.253 |
180.180.16 | 0.255.255 | 182.178.22 | 8.252.255 | 180.179.15 | 0.254.255 | 178.18.13 | 0.254.252 |
180.180.180 | 0.0.0 | 184.179.175 | 0.0.0 | 180.180.180 | 0.0.0 | 178.181.178 | 0.1.0 |
255.255.255 | 255.253.255 | 254.254.254 | 253.255.252 |
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -pix_fmt yuv422p -x264-params colormatrix=smpte170m -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -f flv rtmp://...
ffmpeg -re -loop 1 -r 5 -i gra.png -pix_fmt yuv422p -vf colormatrix=bt601:bt709 -vcodec libx264 -crf 1 -t 60 -y 422.flv
ffmpeg -re -loop 1 -r 5 -i gra.png -x264-params colormatrix=smpte170m -vcodec libx264 -crf 1 -t 60 420.flv
追記 2012年10月21日
png を ffmpeg で取り込む場合は BT.601 入力になるので、-vf colormatrix=bt601:bt709 を使わない方がいい。
正しくは
ffmpeg -re -loop 1 -r 5 -i gra.png -pix_fmt yuv422p -x264-params colormatrix=smpte170m -vcodec libx264 -crf 1 -t 60 422.flv
参照リンク
- avisynth.info (旧 AviSynth Wiki) - ImageSource
- YUVフォーマット及び YUVとRGBの変換
- 鈴木直美の「PC Watch先週のキーワード」
- POP@4bit ≫ Blog Archive ≫ x264のYUV4:4:4/RGB、AviUtlのYC48とYUY2入出力の仕様
- AviutlでMP4動画を作成する際の赤色劣化についてとその対策を紹介します。 ぽぷの実験棟
- Convert - Avisynth
64bit ffmpeg 配信の有効性について
今までは 32bit ffmpeg の使用を推奨していたが、64bit ffmpeg でも制限がありながらも配信できることから、その有効性についてまとめたもの。
64bit ffmpeg は Zeranoe FFmpeg - Builds から 64-bit Builds Static を保存する。
特徴
- 64bit OS でしか使えない
- CPU使用率は高負荷設定ほど下がりやすい
- メモリ消費量は低負荷だと少し増え、高負荷だとかなり減る
- 映像デバイスに制限が多い
アマレココTV、NDC(1.20以前)、XSplit(2.0以前) を直接読み込めない - 音声デバイスにも読み込めないものがある
アマミキ、XSplit(2.0以前) を直接読み込めない
映像デバイスに制限がないのが、SCFH, SCFF, Webcam, Dxtory,NDC(1.20以降), XSplit(2.0以降) などでこれらで配信している人には 64bit ffmpeg でも問題なく配信できる。一方、音声デバイスではアマミキ、XSplit が使えないのでソフトウェアで音声をミックスできなくなるが、VAM が 64bit ffmpeg でも読み込めるのでそちらで代用できる。またミキサーにハードウェアを使っている人はおそらく 64bit ffmpeg でも読み込める。
配信方法
方法は2種類あり、初めから 64bit ffmpeg でエンコード配信する方法と、ffmpeg 32bit で取り込んだのを 64bit ffmpeg に渡してエンコード配信をする方法がある。
- 1つ目の方法
今までアマレココTVや XSplit から映像を読み込んでいた人は、アマレココTVのプレビュー画面を SCFH などでスクリーンキャプチャすることで今まで通りに配信できるようになる。問題は アマレココTVや XSplit から直接配信するのと、スクリーンキャプチャを挟んで配信するのとで画質やラグ、カクカク具合に差が出るかだが、見てわかるほどの差はなかった。
ただし XSplit にアマレココTVを映しているのを SCFH などでスクリーンキャプチャする場合には、XSplit に直接アマレココTVを映した場合に比べて30fpsで3フレーム(つまり0.1秒)遅れたので、キャプチャを複数挟まないほうがいいのに越したことはない。アマレココTVで配信する場合には XSplit を挟まない方がいいが、下の遅延設定を行えばラグは解消できる。
ハードウェアの音声デバイスはドライバーが64bit対応していればおそらく読み込める。もしハードウェアでミックスできない場合は VAM を使うことでPC音とマイク音をミックスでき、マイク音に音量調整や遅延設定もあるのでPC音とずれている場合はそこで調整できる。
- 2つ目の方法
2種類の ffmpeg をつなぐパイプを使うので今までのコマンドよりも長くなるのが特徴。入力デバイスは 32bit ffmpeg で取り込むので制限はない。しかしパイプ処理により多少のパイプラグが発生するが、オプションのバッファ0指定(-fflags nobuffer)にすることで極力パイプラグを減らすことができる。パイプラグは最大で10fps(0.1秒)を確認している。
コマンド例 ffmpeg64 が 64bit ffmpeg
ffmpeg -rtbufsize 250MB -f dshow -i video="AmaRec Video Capture":audio="AmaRec Core Audio Capture" -codec copy -fflags nobuffer -f avi pipe: | ffmpeg64 -r 20 -i - -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m" -acodec libmp3lame -ab 76k -f flv rtmp://...
x264 の 10bit 深度の有効性について
2018年以降の最新版では複数のビット深度に対応したのでビルドを使い分ける必要がなくなった。出力方法は出力フォーマットに -pix_fmt yuv420p10le
を追加する。
x264 のビルドのときに --bit-depth=10 を付けると標準で 10bit 深度になる。何も付けなければ 8bit 深度である。この x264 を使って ffmpeg をビルドするとこちらも標準で 10bit 深度になる。10bit 深度の映像は再生環境が限られるので、自己の動画保存目的以外には推奨されない。
flash 10.3 バージョンだと右端に紫の枠が、11.7 バージョンだと全体が緑っぽくなる。Directshow ベースのデコーダーの場合 LAV Video Decoder は対応しているが、それ以外の備え付けのデコーダーの動画プレイヤは正常に再生できないことが多い。
同様に生放送用途で使う場合でもフラッシュのバージョンで見え方が違うので非推奨である。ニコニコのタイムシフトや Twitc では配信通りにアーカイブ化される。
10bit 深度のメリットは色の階調の表現力であるが、ビットレートが足りていない状況下であえてそれを使うメリットはあるかどうかは未確認。一般的には2割程度エンコード速度が遅くなり、各フレームの AQ QP はとても悪くなる大きくなり(大きくなったからといって画質は悪くなっていない)、容量あたりの ssim は良くなる。
訂正 2013/05/26 0時
AQ ではなく、各フレームの品質を表す QP です。
たくあんさん 指摘ありがとうございます。
訂正 2013/05/26 0時45分
QP の値が 8bit のときと比べて大きくなるのは 10bit の QP の値の範囲が 8bit の時よりも広いので、QP の値が大きくなった=品質が悪くなったのに ssim が上がっている謎現象。と言うように解釈していました。
@nico_lab 8bit-depthでQPは[0, 69]なのに対して10bit-depthでは[0, 81]です
— ConvertToY8(たくあん)さん (@K4095) 2013年5月25日
設定の見方は ffmpeg(libx264) のエンコードログの見方 を参照。
opengl を使って OBS や NLE で取り込む
ffmpeg の出力先を opengl にすることで OBS や NLE、XSplit などで取り込むことができる。これの利点は ffmpeg で取り込んだ映像をフィルタを当てて別デバイスで取り込めるところである。当てるフィルタはリサイズフィルタや色調整フィルタ、unsharp フィルタなどである。欠点はデバイスで映像を取り込んだ時に 0.02 秒ほど遅延するので映像と音声のズレを気にしない場合はそのままで良いが、気にする場合は音声の読み込みを遅らせる必要がある。
基本コマンド
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -f opengl -
映像の遅延分を音声に遅延を加えて読み込むコマンド
ffmpeg -rtbufsize 100MB -f dshow -itsoffset 0.02 -i audio="XSplitBroadcaster" -f dshow -i video="XSplitBroadcaster" 以下略
参照リンク
ffmpeg で OpenGL の表示が可能に
TSを保存せずに倍速再生で視聴する
TS を保存せずに倍速再生する方法は2種類あり、NCV の NCVRTMPDumpWrapper で TS のコメントを取得してプラグインで出力先を外部アプリを起動して視聴する方法。もうひとつが配信中の番組または TS を外部配信サイトやアップローダーなどにミラーして録画データを VLC などで視聴する方法。
プレイヤーで再生するときにコメントをオーバーレイして表示させるかぶせるコメントビューアが便利。
参照リンク
dshow 読み込みと avs 読み込みの違い
dshow 読み込みは例えば FFMPEG Launcher を使って手軽に配信する方法。avs 読み込みはコマンドを書く作業があり配信環境を作るのに手間がかかる方法。
- dshow 読み込みのメリットは配信方法が直感的にわかりやすい。
- avs 読み込みのメリットはAvisynthのプラグインが使えることと、32bit ffmpeg の dshow で読めないデバイスが読み込める場合もあるが、その逆もあり一長一短。
- avs 読み込みのデメリットはコマンドを書く作業に慣れる必要があることと、dshow 読み込みに比べて映像入力の場合はメモリ消費量が起動した時から増え始め、最終的に増大が止まる頃には4倍から5倍とかなり大きい。音声入力の場合はメモリ消費量は増大しないがそれでも3倍程度大きい。
エンコードのログ出力の方法
- -hide_banner
表示されるconfigureオプションやライブラリのバージョンを非表示にする
ffmpeg -hide_banner -i input output
- > hoge.txt 2>&1
配信時のログがリダイレクトされてhoge.txtに出力される。この場合コンソールにはログが表示されない。追記するなら >> hoge.txt 2>&1
ffmpeg -i "ndc.avs" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://... 略 > hoge.txt 2>&1
- ログをコンソールに流さずにテキストで保存する。
ffmpeg -report -i input -vf showinfo -an -f null - > nul 2>&1
先にFFREPORTでファイル名とデバグレベルを指定するとログのファイル名が指定できる。
set FFREPORT=file=showinfo.log:level=48
- コンソールにコマンドが流れて且つテキスト出力する方法
- -vstats
エンコードの状態だけ、libx264では最後のIPBフレームの結果は表示されない
映像のコーディング統計情報を‘vstats_HHMMSS.log’の形式で出力する
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -vstats
- -vstats_file hoge.log
映像のコーディング統計情報をhoge.logの場所に出力する
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -vstats_file hoge.log
- -report
最後のIPBフレームの結果も表示される。
映像のコーディング統計情報を ffmpeg-yyyyMMdd-HHMMSS.log にダンプする
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -report
- -tune ssim -ssim 1
予めあるファイルをエンコードしてエンコード前と後の画質を比較するオプション
訂正 2012年3月30日 配信時にも使えました。
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -tune ssim -ssim 1 -f flv rtmp://...
- -nostats
逆にエンコードの進捗ログを出さない方法
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -nostats
- -benchmark
エンコードの処理時間とメモリ消費量を数値化。値が大きいほど高負荷
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -benchmark -f flv rtmp://... 略
utime:user time、stime:system time、rtime:real time、maxrssの4つが表示される。
Linux の time コマンドのカーネル内部動作と出力される時間の意味 - Qiita
benchmarking - Understanding ffmpeg -benchmark results - Stack Overflow
- -loglevel
ログレベルを指定して表示するログの出力内容を変更する
repeat:「Last message repeated n times」が複数表示されるのを省略する
level:レベル指定。+-でそのログレベルの使用不使用を決める
quiet, -8:なにも表示しない
panic, 0:致命的なエラーだけ表示するが、現在は使われていない
fatal, 8:致命的なエラーだけ表示する。このエラーが出るとプロセスは中断する
error, 16:致命的ではない再開できるエラーも含めてすべてのエラーを表示する
warning, 24:すべての警告とエラーを表示する
info, 32:通常のエラーを表示する。既定値
verbose, 40:infoと似ているがもう少し冗長
debug, 48:デバグ情報を含めてすべてを表示する
trace, 56
ffmpeg -loglevel repeat+level+verbose -i input output
- set FFREPORT=file=ffreport.txt:level=32
fileで出力ログ名を指定しlevelでログレベルを指定すると、そのセッションの間は指定したログに指定したログレベルで上書きする。別のコマンドを別のログファイルで出力するには再度set FFREPORTを実行する
set FFREPORT=file=ffreport.log:level=32
ffmpeg -i input output
- -stats_period 1 -progress foo.txt
-stats_periodの指定秒間隔でエンコードの経過のログファイルを-progressで指定した場所に出力する。以下の例は60秒ごとにfoo.txtに追記出力する。ネットワーク越しにも出力できるのでログ監視にも使える。-stats_periodだけだと既定値は0.5でになり、0.5秒間隔でログがコマンドプロンプトに流れる
ffmpeg -stats_period 60 -progress foo.txt -i input output
出力例
frame=375
fps=24.96
stream_0_0_q=-1.0
bitrate= 6.7kbits/s
total_size=12423
out_time_us=14880078
out_time_ms=14880078
out_time=00:00:14.880078
dup_frames=0
drop_frames=0
speed=0.99x
progress=end
参照リンク
- ffmpeg(libx264) のエンコードログの見方
- 標準エラー出力をファイルへ出力 - リダイレクトとパイプ - コマンドプロンプトの使い方
- X264 Stats Output - MeWiki
- ffmpeg documentation : : Advanced options
- ffmpeg Documentation : : Generic options
メタデータの追加方法
メタデータを追加することで namaroku などで保存した動画ファイルのメタデータを増やすことができる。タイムシフト時にはメタデータは削除されるのでちょっとしたアクセントに使える。
key、value には基本的に半角英数字なら何でも使え、一部の文字はエスケープが必要。日本語も使えるが rtmpdump では文字化けするので非推奨。コミュ番号やエンコード設定を書き込むことができる。
基本的な設定内容は以下を参照。
ffmpeg でメタデータを加える
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -metadata "key"="value" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略
Avisynthのフィルターを使う
クロップ
映像をキャプチャーボード取り込みで左右上下に黒枠が出る場合にクロップで取り除くことができる。
キャプチャーした映像が4:3固定で16:9の映像を取り込む場合には上下をクロップする。
クロップには2種類記述方法がある
.Crop(左, 上, クロップ後の幅, クロップ後の高さ)
.Crop(左, 上, -右, -下)
私が所有しているI-O DATA GV-USBではこれで16:9の映像が綺麗に表示された
.Crop(6,64,-6,-64)
参照リンク
avisynth.info (旧 AviSynth Wiki) - Crop
にーやんのアーカイブ: クロップ(黒い縁をカットする)
リサイズ
普通にリサイズしたい場合
.BilinearResize (512,288)
.BilinearResize (512,384)
シャープにリサイズしたい場合
.LanczosResize (512,288)
.LanczosResize (512,384)
クロップとリサイズを同時に記述することも出来る。最初がリサイズ後の解像度、その後がクロップするピクセル数で、上のGV-USBのクロップをリサイズと一緒に記述すると
.BilinearResize (512,288,6,64,-6,-64)
参照リンク
avisynth.info (旧 AviSynth Wiki) - Resize
インターレース解除
インターレース解除にアマレコ TV Liveを使っている場合はそちらで解除する。Avisynthで有名なのはYadif
参照リンク
オーバーレイ
オーバーレイを使うことで配信しているゲーム画面にウェブカメラや画像を載せたりできる。ここではオーバーレイと言うより分かりやすくワイプという言葉を使っている。必要に応じてコードを増やしたり減らしたりする。
以下のコードで変更する点はワイプ画面の大きさ、配信fps、配信枠数、ワイプのリサイズオプション、ワイプの位置、色は元の映像とワイプ映像を合わせたところだけを指定する。下のコードで言うとvideo3からvideo7まで。画像には透過pngは使えるが、アニメgifは使えない。
例 ここから
# ワイプ画面の大きさ
wipe_width = 160
wipe_height = 120
# 配信fps
wipe_fps = 30
# 配信枠数 1枠30分
wipe_waku = 1
wipe_time = wipe_waku * 1800 # 放送枠の秒数
wipe_framecount = wipe_fps * wipe_time # 放送枠の合計フレーム数
# video1 : 元となる映像
# video2 : ワイプ画面となる映像
video1 = DirectShowSource ("ndc.grf",fps=wipe_fps,audio=false,framecount=wipe_framecount)
video2 = DirectShowSource ("webcam.grf",fps=wipe_fps,audio=false,framecount=wipe_framecount).LanczosResize (wipe_width, wipe_height)
# img : ワイプ画面となる画像
img = ImageSource ("img.png", 0, wipe_framecount, wipe_fps).LanczosResize (wipe_width, wipe_height)
# 画面左上にワイプ画面
video3 = video1.Overlay(video2, x=0, y=0)
# 画面右上にワイプ画面
video4 = video1.Overlay(video2, x=video1.width - wipe_width, y=0)
# 画面左下にワイプ画面
video5 = video1.Overlay(video2, x=0, y=video1.height - wipe_height)
# 画面右下にワイプ画面
video6 = video1.Overlay(video2, x=video1.width - wipe_width, y=video1.height - wipe_height)
# 画面右下にワイプ画面(画像)
video7 = video1.Overlay(img, x=video1.width - wipe_width, y=video1.height - wipe_height)
# 音声取り込み
audio = DirectShowSource ("mic.grf", fps=wipe_fps, video=false, framecount=wipe_framecount)
# 映像と音声の合成
AudioDub (video3, audio)
例 ここまで
参照リンク
ロゴ追加
ロゴ追加は映像の任意の場所にロゴ(画像)を配置できる。
参照リンク
- avisynth.info (旧 AviSynth Wiki) - ロゴ
- avisynth.info (旧 AviSynth Wiki) - サンプルスクリプト/ロゴの追加(1)
- avisynth.info (旧 AviSynth Wiki) - サンプルスクリプト
サブタイトル
サブタイトルは映像の任意の場所に文字を挿入することができる。
参照リンク
- avisynth.info (旧 AviSynth Wiki) - Subtitle
- avisynth.info (旧 AviSynth Wiki) - サンプルスクリプト/テロップの挿入
- avisynth.info (旧 AviSynth Wiki) - サンプルスクリプト/複数行のテロップ
FFmpegのフィルタを使う
フィルタの指定方法
同じフィルタに別の値を指定する場合は「:」で連結し、別のフィルタに切り替える場合は「,」で連結する。別のデータに切り替える場合は「;」で連結する。フィルタは書いた順番にフィルタがかける。リサイズは最初に、次にノイズ除去、unsharp でくっきりさせる場合は最後にかける。
入力ファイルを指定(マッピング)する場合、フィルタを当てる前は入力ファイルのコンテナに格納されている順にする。詳しくは 【ffmpeg】 マルチトラックの動画の作り方 を参照。フィルタを使ってのマッピングはフィルタを当てた後に識別子を決めて、それを別のフィルタの先頭に指定する。そして一番重要なのは入力ファイルの次に指定すること。エンコード設定の次に指定すると圧縮したデータを元にフィルタをかけるので、それが目的でないのなら入力ファイルの次に指定する。
-i input1 -i input2 -filter_complex "[0:0]unsharp=3:3:0.5,pad=2*iw:0[left];[left][1:0]overlay=w"
フィルタの効き具合を比較する
映像フィルタを掛けた場合に掛ける前と掛けた後を見比べて効果を検証する方法。
スプリットフィルタ と padフィルタ を併用することで前後の画面を2画面で表示して見比べることができる。2.8.0 以降は低負荷で stackフィルタ が使えるのでこちらを推奨。
左はそのまま、右に unsharp フィルタを適応し ffplay でプレビュー
ffplay -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w
ffplay -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -vf split[a][b];[b]unsharp[B];[a][B]hstack
上はそのまま、下に unsharp フィルタを適応し ffplay でプレビュー
ffplay -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -vf split[a][b];[a]pad=0:2*ih[A];[b]unsharp[B];[A][B]overlay=0:h
ffplay -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -vf split[a][b];[b]unsharp[B];[a][B]vstack
signalstats フィルタを使って YUV を比較する。[b]の先頭に比較したいフィルタを加える。サンプルは unsharp
左右比較 [b]の最初に比較するフィルタを追加する
ffplay -f lavfi -i mptestsrc -vf "split[a][b];[a]signalstats=stat=brng+vrep+tout,crop=iw/2:ih:0:0, drawtext=fontfile='C\://WINDOWS/Fonts/times.ttf':textfile=signalstat_drawtext.txt: fontcolor=white:fontsize=16:x=0:y=0:borderw=1:bordercolor=red[l];[b]unsharp,signalstats=stat=brng+vrep+tout,crop=iw/2:ih:iw/2:0, drawtext=fontfile='C\://WINDOWS/Fonts/times.ttf':textfile=signalstat_drawtext.txt: fontcolor=white:fontsize=16:x=0:y=0:borderw=1:bordercolor=red[r];[l][r]hstack"
上下比較 [b]の最初に比較するフィルタを追加する
ffplay -f lavfi -i mptestsrc -vf "split[a][b];[a]signalstats=stat=brng+vrep+tout,crop=iw:ih/2:0:0, drawtext=fontfile='C\://WINDOWS/Fonts/times.ttf':textfile=signalstat_drawtext.txt: fontcolor=white:fontsize=16:x=0:y=0:borderw=1:bordercolor=red[l];[b]unsharp,signalstats=stat=brng+vrep+tout,crop=iw:ih/2:0:ih/2, drawtext=fontfile='C\://WINDOWS/Fonts/times.ttf':textfile=signalstat_drawtext.txt: fontcolor=white:fontsize=16:x=0:y=0:borderw=1:bordercolor=red[r];[l][r]vstack"
signalstat_drawtext.txt には以下の記事を参考にして書く。signalstat_drawtext1.txt は同じファイルをリネームする。
サンプルはこちらからダウンロードできる。
YUV、彩度、色相 を見える化する signalstats
ヒストグラムを比較することも出来る:ffmpeg でヒストグラムを表示する
SSIM もフィルタを掛ける前後で比較できる。
ffmpeg -i input1 -filter_complex split[a][b];[b]unsharp[B];[a][B]ssim -an -f null -
ffmpeg -i input1 -filter_complex split[a][b];[b]unsharp[B];[a][B]ssim=stats.txt -an -f null -
2つの映像の画質評価をする SSIM
md5 を調べることもできる。
ffmpeg -i input -f md5 -
1画面に同時に複数のフィルタを掛ける
特定の色にだけフィルタを当てる場合と、明暗の違いによってフィルタを使い分ける方法がある。
特定の色だけ:ffmpeg でクロマキー合成
明暗の違いで使い分け:ニコ生で高画質配信する複合フィルタの例
明暗の違いで使い分け(低負荷):マスクして2入力を合わせる maskedmerge
drawtext(テキスト描写)
映像にテキストを表示させる。あらかじめ libfreetype とlibfontconfig をインストールしておく。このブログで書いてある方法で作った ffmpeg ではこのフィルターは使えない。
こちらを参考にインストールする
FreeType(libfreetype)のコンパイル&インストール お気に入りの動画を携帯で見よう
fontconfigのコンパイル&インストール お気に入りの動画を携帯で見よう
生放送用途に使えそうなオプションのまとめ
- box
テキストの背景をテキスト幅で囲む。既定値:0(無効)
- boxcolor
box の背景色を指定。red などの色指定と random でランダム、RRGGBB の指定方法がある。
詳しくは FFmpeg Utilities Documentation :: Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能。
既定値:white
- borderw
テキストの周りを指定ピクセル分囲む。つまり縁取りのサイズの指定。既定値:0(無効)
- bordercolor
borderw の色を指定。既定値:black
- fontcolor
テキストの色指定。詳しくは FFmpeg Utilities Documentation :: Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能。
- fontfile
フォントのパスを指定。日本語の場合は日本語フォントを指定しないと正しく表示されないのに注意。日本語ファイル名のフォントは別の場所にコピーして半角英数字に変える。絶対パスの指定方法は以下のようにする。
fontfile='C\://Windows/Fonts/msgothic.ttc'
- fontsize
フォントサイズの指定。既定値:16
- shadowcolor
テキストの影の色指定。詳しくは FFmpeg Utilities Documentation :: Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能。
- shadowx
テキストの影を x 軸の方向に表示。既定値:0
- shadowy
テキストの影を y 軸の方向に表示。box を併用した場合影の部分がはみ出るのに注意。既定値:0
- start_number
テキスト描写の開始フレームの指定。既定値:0
- tabsize
タブ1つがスペースいくつか。既定値:4
- text
描写するテキストの指定。文字コードは UTF-8 でなければならない。
静的なテキストだけではなく動的なテキストも可能である。後述。
- textfile
描写するテキストをファイルのパスを指定。text と併用できない。text と同様に文字コードは UTF-8 でなければならない。
- reload
textfile で指定したファイルが書き換われば動的に描写するテキストも書き換わる。既定値:0
textfile の内容を全部消して空にするとエラーが出て配信が止まるのに注意。
- x
描写するテキストの x 軸の指定。既定値:0
- y
描写するテキストの y 軸の指定。既定値:0
以下の設定が描写するテキストの座標に使える。
- sar
サンプルアスペクト比
- dar
(w/h)*sar
- n
表示している映像のフレーム番号。既定値:0
- t
表示している映像のタイムスタンプ。
- rand(min, max)
最小値と最大値の値をランダムで返す。
- main_h, h, H
入力データの背景の高さ。
- main_w, w, W
入力データの背景の幅。
- text_h, th
描写しているテキストの高さ。fontsize で動的に変わる。
- text_w, tw
描写しているテキストの幅。文字数と fontsize で動的に変わる。
text の発展的な使い方
- YYYY-MM-DD HH:MM:SS 形式で日時と時間の表示
text='%{gmtime}'
- YYYY-MM-DD HH:MM:SS 形式で日時と時間の表示
text='%{localtime}'
- hh:mm:ss 形式で時間の表示
text='%{localtime\:%X}'
そのほかの指定方法は PHP: strftime - Manual を参照。
使えなかったのはこちら r, T, D, F, s, R, P, l, I, k, G, C, h, V, u, e
- 現在のフレーム番号を表示(0スタート)
text='%{n}'
text='%{frame_num}'
- 現在のタイムスタンプを表示
- マイクロ秒で表示。既定値
text='%{pts\:flt}'
- HH:MM:SS.mmm 形式で表示
text='%{pts\:hms}'
例
ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)" -vf drawtext="fontfile='C\://Windows/Fonts/msgothic.ttc':text='Text to write':fontsize=20:x=100:y=100:fontcolor=red:bordercolor=yellow" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k hoge.flv
come.txt をリアルタイムで表示しながら上部真ん中にテキストを表示
ffplay -f lavfi -i color=c=black:r=24 -vf drawtext=fontfile="'C\://Windows/Fonts/msgothic.ttc':fontcolor=black: textfile='come.txt':fontsize=24:x=(w-tw)/2:reload=1: borderw=2:bordercolor=white@0.5"
現在の時刻を左上に表示
ffplay -f lavfi -i color=c=white:r=24,drawtext=fontfile="'C\://Windows/Fonts/msgothic.ttc':text='%{localtime}'"
- text と textfile が両方指定されている場合はエラー
- textfile は改行コメントができるが text の改行コメントの仕方がわからない
- boxcolor は box と併用する
- shadowx,shadowy は shadowcolor と併用する
- borderw は bordercolor と併用する
- x, y 映像フレーム内でテキストが描画される場所の位置で出力画像の左上隅からの相対位置
参照リンク
- Libav documentation : : drawtext
- FFmpeg documentation : : drawtext
- windows - FFmpeg drawtext - Could not load fontface from file - Stack Overflow
- ニコ生のTSから一定時間毎に画像を出力する
- ffmpeg でテキストを動的に表示する
オーバーレイ
2つ以上の映像入力を重ね合わせる。単純に映像をつなげる場合は スタック の方が低負荷でコードの量が少ない。第1引数を横軸、第2引数に縦軸を2入力のオーバーレイする映像の座標として指定する。
例
-vf "movie=img.png [logo]; [in][logo] overlay=Width:Height [out]"
1入力の背景に 2入力を重ねる。そのときに Width:Height(左上が0:0)で指定する。
オプション内容
- main_w, W
main_h, H
1入力の解像度を返す
- overlay_w, w
overlay_h, h
2入力の解像度を返す
- n
フレーム数を返す
- t
タイムスタンプ秒を返す
- 右下隅に img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=W-w:H-h [out]" - 左下隅に img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=0:H-h [out]" - 右上隅に img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=W-w [out]" - 左上隅に img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay [out]" - 右下隅に10px開けて img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]" - 左下隅に10px開けて img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=10:H-h-10 [out]" - 右上隅に10px開けて img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=W-w-10:10 [out]" - 左上隅に10px開けて img.png を配置する
-vf "movie=img.png [logo]; [in][logo] overlay=10:10 [out]"
filter_complex を使う場合
-i video1 -i video2 -filter_complex "overlay=W-w-10:H-h-10"
同じ幅の解像度に半分づつ横に並べる場合
-i video1 -i video2 -filter_complex [1:0]crop=iw/2:ih:iw/2:0[r];[0:0][r]overlay=W/2:0
複数の映像ソースを取り込むときにそれぞれのタイムスタンプに注意する。特に dshow で映像を取り込む場合にはそれぞれがずれていないか確認する。
各入力映像から取られるフレームはタイムスタンプの順であることを意識すること。 したがって、それらの初期タイムスタンプが異なるなら、setpts=PTS-STARTPTS フィルターに通し、それらが同じゼロタイムスタンプから始まるようにして (movie フィルターの例で行っているように )2つの入力を渡すことは 良い考えである。
2以上オーバーレイする場合は最初のオーバーレイを次のオーバーレイの目的にする。
直ぐ下の movie フィルタにも多重オーバーレイの方法を書いています。
例 img1 を右下に img2 を左上に配置
-i video -vf "movie=img1 [A]; movie=img2 [B]; [in][A] overlay=W-w-10:H-h-10 [C]; [C][B] overlay=10:10 [out]"
-i video -i img1 -i img2 -filter_complex "[0:0][1:0] overlay=W-w-10:H-h-10 [A]; [A][2:0] overlay=10:10"
720p の画像に 360p の動画を中心に配置
ffmpeg -loop 1 -i image.jpg -i video.mp4 -filter_complex "overlay=(W-w)/2:(H-h)/2:shortest=1,format=yuv420p" -c:a copy output.mp4
参照リンク
- Libav documentation : : overlay
- FFmpeg documentation : : overlay
- ffmpeg.arrozcru.org ? View topic - FFmpeg image overlay - libavfilter
- 【ffmpeg】 比較動画の作り方
スタック(映像を並べる)
2つ以上の映像を入力し、縦または横に並べる。従来の方法は pad フィルタで余白を作って overlay フィルタで余白に置いて複数の映像を並べていたが、 hstack, vstack フィルタを使えば文字数少なく処理がはやくなる。注意点は vstack なら横幅、 hstack なら縦幅が同じで、映像フォーマットも同じであること。
縦に並べる。1入力が一番上で順番に下につながる
-vf split,vstack
横に並べる。1入力が左で順番に右につながる
-vf split,hstack
3毎、つなげる場合
-vf split=3,vstack=3
識別子をつける場合
-vf split[a][b],[a][b]vstack
参照リンク
FFmpeg Filters Documentation :: hstack
FFmpeg Filters Documentation :: vstack
movie
透過pngを含む画像や動画をフィルタ内に取り込む。音声は amovieフィルタを使う。またインターネット上のソースも可能。特殊文字のエスケープに注意。
例えばテストソースにニコニコ大百科のロゴを右下に配置する方法
http://dic.nicovideo.jp/img/logo_nicopedia.gif
ffplay -f lavfi -i testsrc -vf "movie='http\://dic.nicovideo.jp/img/logo_nicopedia.gif' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"
例:C:\img\test.png を指定する場合
絶対パスで指定する方法
-vf "movie='C\:/img/test.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"
相対パスで指定する方法
ffmpeg のフォルダ内のimgフォルダ内にある img.png を指定する
-vf "movie='img/img.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"
ffmpeg のオーバーレイを使った出力例
ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -vf "movie='C\:/img/test.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"-x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv
特定の時間から読み込むこともできる。以下の例は 開始10秒から読み込む。
ffplay -f lavfi -i "movie=video.mp4:sp=10,setpts=PTS-STARTPTS"
読み込み終了時間を指定する場合は trim フィルタの duration を併用する。
以下の例は開始10秒から10秒間読み込む。
ffplay -f lavfi -i "movie=video.mp4:sp=10,trim=duration=10,setpts=PTS-STARTPTS"
参照リンク
デロゴ
デロゴフィルターだが効果はロゴデータを用いてロゴを消すのではなくて、指定範囲をぼかす(周りの色を参考にブレンドする)フィルター。弱点としてぼかす範囲内に明暗差が激しい映像だときれいにぼかせない。
例
-vf "delogo=x:y:w:h:show"
修正 2014年8月11日
コメント番号 739 より
x:y はぼかす位置の左上隅の座標。横:縦
w:h はぼかす範囲の解像度。横:縦
t オプションは2021年の1月に廃止された
show[boolean] フィルタが当たる部分の外枠1ピクセルを緑色で描写する。別途外枠にピクセルを描写するのでshowの設定の有無にかかわらずx=0:y=0などの隅に使えず1ピクセル以上隅から離す。
doc/filters: remove option band in delogo FFmpeg/FFmpeg@c5341d4 GitHub
使い方例
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "delogo=362:230:98:30:0" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv
XSplit のロゴを消す場合の指定例
-vf "delogo=366:234:92:25" / 512x288 の解像度
-vf "delogo=366:319:92:25" / 512x384 の解像度
-vf "delogo=460:290:114:32" / 640x360 の解像度
-vf "delogo=460:398:114:32" / 640x480 の解像度
参照リンク
FFmpeg documentation : : delogo
ロゴ除去
こちらがロゴデータを元にロゴを消す(周りの色を参考に転写する)フィルター。ただしこちらもロゴデータの下に明暗差が激しい映像だときれいにぼかせない。また配布しているffmpegによってはこのフィルターが使えないかもしれない。
追記 2013/08/31
例
-vf removelogo=f=logo.bmp
実行するffmpegと同じフォルダ内にロゴデータを置いてffmpegを実行する。
ロゴデータは背景を真っ黒にロゴだけを表示してスクリーンショットをとって.bmp形式で保存する。
ロゴデータの解像度と元の映像の解像度は一致しなければならない。
XSplit のロゴを消す場合の指定例
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf removelogo=f=logo.bmp -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv
XSplit 用のロゴデータはこちらにアップしています。
Dropbox - removelogo_XSplit.zip
参照リンク
FFmpeg documentation : : removelogo
removelogo の利用例:ffmpeg できれいにロゴを消す方法
以下は旧仕様
例
-vf "mp=remove-logo:logo.ppm"
実行するffmpegと同じフォルダ内にロゴデータを置いてffmpegを実行する。
ロゴデータは背景を真っ黒にロゴだけを表示してスクリーンショットをとって.ppm形式に変換する。画像変換には IrfanView を使う。画像を開いて ファイル < 名前を付けて保存 < ファイル形式 PPM 圧縮なし バイナリデータとして符号化 で保存する。
XSplit のロゴを消す場合の指定例
ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "mp=remove-logo:512x288.ppm" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv
XSplit 用のロゴデータはこちらにアップしています。
removelogo_data.zip - Solidfiles
XSplit のロゴデータをきれいに消す裏ワザがあり、16:9の解像度の映像なら横幅を固定して4:3の解像度で配信して、映像を上に移動させておけばロゴを消す背景部分が真っ黒になりロゴだけきれいに消える。この場合コメントを下に流すコマンド /commentmode shita
を使うと見栄えが良くなる。

例
配信映像が512x288ならXSplitかNLEの配信解像度を512x384にして、配信する映像を上に合わせる。
配信映像が640x360ならXSplitかNLEの配信解像度を640x480にして、配信する映像を上に合わせる。
参照リンク
スケール
入力ソースを拡縮する。
例
-vf "scale=width:height"
入力映像を 幅:高さ に拡縮する。片方を -1 に指定してもう片方を実数にするとアスペクト比を保持して実数に合うように拡縮する。iw と ih は入力映像の横と縦の解像度。
例 入力映像が16:9なら512x288に、4:3なら512x384になる
-vf "scale=512:-1"
例 横幅を半分にして縦幅をアスペクト比にあわせる
-vf "scale=iw/2:-1"
また同時にリサイズオプションも併用できる
-sws_flags lanczos -vf "scale=512:-1"
-vf "scale=512:-1:flags=lanczos"
ffmpeg の出力例
ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -sws_flags lanczos -vf scale=-1:288 -vcodec libx264 -crf 27 -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 80k hoge.flv
参照リンク
Zスケール
外部ライブラリを使って新しいリサイズ方法を追加する。
例
-vf zscale=640:-1:f=spline16
詳しくは:Zライブラリを使ったリサイズフィルタ zscale
クロップ
入力映像をクロップ(切り出)して出力映像の解像度を小さくする。
例
-vf "crop=x:y:w:h"
x:y は出力解像度。横:縦
w:h は出力解像度の左上隅の座標。横:縦
左上隅の座標は0:0です
入力映像の解像度が 512x384 のときクロップして上の青い部分を残して 512x288 にする方法は

例
-vf "crop=512:288:0:0"
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "crop=512:288:0:0" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k hoge.flv
訂正 2012年6月8日
指摘があり、クロップの記述を訂正しました。
参照リンク
decimate
フレームを間引くdecimate、mpdecimateに内容を引っ越した。
スプリット
入力した映像をコピーしフィルタの適応を比較する場合などに使う。ffplay でフィルタの比較をするのに便利。既定値は 2。
例
-vf split=2
左はそのまま、右に unsharp フィルタを適応し ffmpeg でエンコード
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w -pix_fmt yuv420p -vcodec libx264 out.flv
左はそのまま、右に unsharp フィルタを適応し ffplay でプレビュー
ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w
上はそのまま、下に unsharp フィルタを適応し ffplay でプレビュー
ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=0:2*ih[A];[b]unsharp[B];[A][B]overlay=0:h
コマンドを実行するには cmd.zip を保存し ffmpeg, ffplay と同じフォルダ内に解凍して、cmd を実行し、コマンドをコピペすればコマンドラインから ffmpeg, ffplay を実行できる。
出力解像度を小さくする場合には末尾にスケールフィルタを当てる
ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w,scale=320:-1
FFML でフィルタ比較をする場合には「フィルタを有効にする」にチェックを入れて、「split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w」をコピペする。

参照リンク
3次元デノイズフィルタ
3次元(縦軸、横軸、時間軸)のデノイズフィルタ。ノイズかかる部分をのっぺりとさせて高画質にする。配信時にはビットレートが限られるので映像が緻密でない場合には効果的かも。CPU負荷はそれなりに上昇する。
例
-vf hqdn3d=luma_spatial:chroma_spatial:luma_tmp:chroma_tmp
- luma_spatial
輝度強度、値は正の小数点を含む値 既定値は 4.0 - chroma_spatial
彩度強度、値は正の小数点を含む値 既定値は 3.0*luma_spatial/4.0 - luma_tmp
一時的な輝度強度、値は実数 既定値は 6.0*luma_spatial/4.0 - chroma_tmp
既定値は luma_tmp*chroma_spatial/luma_spatial
それぞれを直接指定しない場合は luma_spatial を変えると他の3つの値も変わるので luma_spatial だけを変えるのが基本設定。
ffmpeg の出力例
ffmpeg -i input -vf hqdn3d output
参照リンク
- FFmpeg documentation : : hqdn3d
- How to Use ffmpegXメモ was here (2005/04~2006/08): hqdn3dとx264のnr、とか
- 3次元ノイズリダクションとは 【 3DNR 】 〔 テンポラルノイズリダクション 〕 - 意味/解説/説明/定義 : IT用語辞典
pp(ホストプロセス)
ポストプロセッシングフィルタの中から配信用に使えそうなデブロックフィルタとデノイズフィルタの使い方。デブロックフィルタとデノイズフィルタをかけると複雑な部分、ノイズがかかった部分をのっぺりと平坦化させてビットレートを稼ぐフィルタ。ただし64bitのffmpegでは使えない。使えるようになってた。2013年4月25日
主な利用方法は低品質の映像のデノイズなので、配信用途で使われる directshow 読み込みのオリジナルデータでは余り効果的ではない。ニコ生のようなサイトでは映像の細かい部分を再現しながらエンコードするとビットレートが足りなくなるので使い道はある。VHS などのアナログソースや MPEG-1, MPEG-2 などのデータが主な使い道である。
デノイズする場所は difference で、デノイズの強度は flatness で設定できるので見た目に関わる重要な部分を維持しながら平坦化して限られたビットレートで全体の画質向上を図る。
値の指定には「|」、オプションの指定には「/」で挟んでフィルタを連結する。
例
-vf pp=hb|a/vb|a/dr|a
使用例:ニコ生で使うデノイズフィルタの例
詳細な設定:デノイズとインターレース解除ができる pp
- a/autoq
CPU性能に応じてオンオフのオート設定。特に指定する必要なし - hb/hdeblock[|difference[|flatness]] // hb|difference|flatness
横軸のデブロッキングフィルタ
difference : 差異要因:大きい値ほど効果が大きい(場所指定)(既定値:32)
flatness : 平坦化の閾値:小さい値ほど効果が大きい。下げすぎ注意(強度指定)(既定値:39) - vb/vdeblock[|difference[|flatness]] // vb|difference|flatness
縦軸のデブロッキングフィルタ
既定値は hb と同じで以下同様 - ha/hadeblock[|difference[|flatness]] // ha|difference|flatness
横軸の正確なデブロッキングフィルタ
正確といっても負荷が高かったり、高品質とは一概には言えない - va/vadeblock[|difference[|flatness]] // va|difference|flatness
縦軸の正確なデブロッキングフィルタ - tn/tmpnoise[|threshold1[|threshold2[|threshold3]]] // tn|threshold1|threshold2|threshold3
一時的なノイズ低減フィルタで閾値を大きくするほど効果が大きい
- dr/dering
デリンギングフィルタ
- fq/forceQuant[|quantizer]
quantizer の個別指定。数値指定。他のオプションと併用(一部効果の無いオプションがある)で効果がある。0 は他のデブロックオプションを無効化し、1 はそのまま。大きい値ほど全体がぼやける
ffmpeg の出力例
ffmpeg -i in.mp4 -vf "pp=ha|a|128|7/va|a/tn" out.mp4
フィルターサンプル
- 既定値
pp=de
pp=hb|a/vb|a/dr|a
- 処理が軽め
pp=fa
pp=h1|a/v1|a/dr|a
- 高品質
pp=ac
pp=ha|a|128|7/va|a/dr|a
- 縦横軸のデブロックとデリンギング、明度とコントラストの自動設定
pp=hb/vb/dr/al
- 明度とコントラストの自動設定をせずに、既定値のフィルタを当てる
pp=de/-al
- 既定値のフィルタと一時的なノイズ低減フィルタを当てる
pp=default/tmpnoise|1|2|3
- 輝度だけデブロックと縦軸のデブロックとCPU自動設定をオフ
pp=hb|y/vb|a
参照リンク
FFmpeg documentation : : pp
Postprocessing – FFmpeg
グレイン除去
グレイン除去と言っても処理の内容はそれぞれのチャンネルに個別にデノイズ処理を行うフィルタ。U, V を調整すると色味が変わるので注意。
チャンネルの指定
- m0
Y または G チャンネル
- m1
U または B チャンネル
- m2
V または R チャンネル
- m3
A チャンネル
適応フィルタ
- 0
なにもしない
- 1
周囲8ピクセルの最大値と最小値を返す
- 2
周囲8ピクセルの最大値と最小値の2番目を返す
- 3
周囲8ピクセルの最大値と最小値の3番目を返す
- 4
周囲8ピクセルの最大値と最小値の4番目を返す(median)
- 5 から 24 まで省略。詳細は公式ドキュメントとソースコードを確認
フィルタの設定の 0 から 4 までが単純なので効果がわかりやすい。数値が上がるにつれてコントラストが小さくなり容量も小さくなりやすい傾向にある。詳しい効果については Chikuzen氏の記事を参照。
軽めに掛けるのならば 1、適宜映像を見ながら 2, 3, 4 と上げてみる。
ffmpeg -i input -vf removegrain=m0=1:m1=1:m2=1 output
参照リンク
FFmpeg documentation : : removegrain
FFmpeg/vf_removegrain.c at master · FFmpeg/FFmpeg
RemoveGrain mode1~mode4
RemoveGrain mode5~mode12
RemoveGrain mode13~mode16
RemoveGrain mode17~mode22
RemoveGrain mode23/mode24 及び総評
ぼやけた画像からドット絵を抽出する - Post - Seaside Laboratory
sab(強力な2次元デノイザ)
詳しくはこちら:強力な2次元デノイザ sab
unsharp(鮮鋭化フィルタ)
線をクッキリ、またはぼんやりさせるフィルタ。既定値ではクッキリしすぎて映像が変わりすぎるので最低限にとどめたほうが良い。
例
-vf unsharp=luma_msize_x:luma_msize_y:luma_amount: chroma_msize_x:chroma_msize_y:chroma_amount:opencl
- luma_msize_x
輝度マトリックスの横軸。3から63までの奇数の整数で、既定値は 5 - luma_msize_y
輝度マトリックスの縦軸。3から63までの奇数の整数で、既定値は 5 - luma_amount
輝度マトリックスの影響度。-1.5 から 1.5 の小数点を含む値で、既定値は 1.0
マイナスの値でぼやかし、プラスの値でクッキリさせる。0 は効果無し - chroma_msize_x
彩度マトリックスの横軸。3 から 63 までの奇数の整数で、既定値は 5 - chroma_msize_y
彩度マトリックスの縦軸。3 から 63 までの奇数の整数で、既定値は 5 - chroma_amount
彩度マトリックスの影響度。-1.5 から 1.5 の小数点を含む値で、既定値は 0.0
マイナスの値でぼやかし、プラスの値でクッキリさせる。0 は効果無し - opencl
opencl の使用可否で、既定値は 0。使用には --enable-opencl が必要
既定値でフィルタを当てる場合には
ffmpeg -i in.mp4 -vf "unsharp" out.mp4
ffmpeg -i in.mp4 -vf "unsharp=5:5:1.0:5:5:0.0" out.mp4
しかしこのままだとクッキリしすぎるので値を小さくする。
ffmpeg の出力例
ffmpeg -i in.mp4 -vf "unsharp=3:3:0.5:3:3:0.5:0" out.mp4
参照リンク
FFmpeg documentation : : unsharp
eq(明暗調整)
mplayer wrapper が ffmpeg 2.6 から廃止されたので、mp eq の代わりに eq を使う。
YUV 映像にオプションの gamma 関係を使っても出力フォーマットは RGB に変わらない。RGB24 で入力しても出力フォーマットは yuv420p になる。
例
-vf "eq=contrast=1:brightness=0:saturation=1:gamma=1: gamma_r=1:gamma_g=1:gamma_b=1:gamma_weight=1"
-vf eq=1:0:1:1:1:1:1:1
- contrast
コントラスト:-2.0 から 2.0 までの float、既定値は 1
上げると暗く締まった感じに、下げると明るくぼやけた感じに。YUV だと Y にだけ影響がある。
- brightness
輝度:-1.0 から 1.0 までの float、既定値は 0
上げると明るく、下げると暗くなる。YUV だと Y にだけ影響がある。
- saturation
彩度:0.0 から 3.0 までの float、既定値は 1
上げるとはっきりとした色に、下げるとモノクロに近づく。YUV だと UV に影響がある。
- gamma
ガンマ(階調度)、赤青緑全ての影響:0.1 から 10.0 までの float、既定値は 1
上げると階調が広がる(明るく)、下げると階調が狭まる(暗く)
- gamma_r
赤色ガンマ:0.1 から 10.0 までの float、既定値は 1
- gamma_g
緑色ガンマ:0.1 から 10.0 までの float、既定値は 1
- gamma_b
青色ガンマ:0.1 から 10.0 までの float、既定値は 1
- gamma_weight
ガンマ強度、ガンマ設定したのを全体的にどれだけ影響させるか。0 ほど影響がない。
0.0 から 1.0 までの float、既定値は 1
- eval
計算書式に使う変数を最初の値のままにするかフレーム毎に読み込むか
init:そのまま(既定値)、frame:フレーム毎
- 計算書式に使える変数
n:フレーム数、最初は 0, pos:バイトポジション, r:フレームレート, t:タイムスタンプ秒
計算書式の例
1秒ごとに明るくなり、10秒たつと元に戻るのを繰り返す
ffplay -f lavfi testsrc,eq=eval=frame:brightness="mod(t\,10)/10"
参照リンク
FFmpeg Filters Documentation :: eq
mp-eq(明暗調整)(旧仕様)
映像全体を明るくしたり暗くしたり、はっきりした色に調整する。実際の明度調整は下のカラーバランスフィルタを推奨。mp の映像フィルタ系列は ffmpeg 2.6 で廃止になった。
例
-vf mp=eq=brightness:contrast
brightness は輝度 -100 から 100 まで +1毎にRGBが2程度大きくなり明るくなる。
contrast はコントラスト比 -100 から 100 まで 配信用途では特に変更しない。
ffmpeg の出力例
ffmpeg -i in.mp4 -vf mp=eq=3:0 out.mp4
参照リンク
ITmedia +D PCUPdate:輝度とコントラスト比は高いほど良いのか? (1/2)
MPlayer
LUT(ルックアップテーブル、ラット)
YUV(A), RGB(A), GRAY(ffmpeg 4.0 以降) データを任意に調整できるフィルタ。上の eq よりも直感的に設定できる。eq は平均的に上げ下げできるのに対して、lut は val を使うことで元の数値が大きいほど効果が強くなる。入力するデータによってフィルタ名を変えて使う。YUV なら lutyuv, RGB なら lutrgb。GRAY を含めてプレーン順で指定する場合は lut を使う。
既定値の輝度を1.2倍上げて明るくする
-vf lutyuv=y=1.2*val
- c0
最初のチャンネルを指定
- c1
2番目のチャンネルを指定
- c2
3番目のチャンネルを指定
- c3
4番目のチャンネルを指定。一般的にはアルファチャンネル
- r
RGB の R を指定
- g
RGB の G を指定
- b
RGB の B を指定
- a
アルファチャンネルの指定。8bit 深度なら 255 で透過せずに、0で完全透過になる
- y
YUV の Y(輝度)を指定
- u
YUV の U/Cb(青)を指定
- v
YUV の V/Cr(赤)を指定
使える書式
- w
入力した映像の横幅
- h
入力した映像の縦幅
- val
入力した映像の値
- clip
- maxval
入力した映像の最大値
- minval
入力した映像の最小値
- negval
入力した映像の反転値
- clip(val, minval, maxval)
3つの引数をとり、minval から maxval までのレンジを返す。int を代入するとレンジを狭めたりできる
数値があふれた場合は、minval , maxval の値で出力される
- clipval
TVスケールにクリップする
- gammaval(gamma)
pow((clipval-minval)/(maxval-minval),gamma)*(maxval-minval)+minval
書式を利用した例
明るいところ、暗いところにフィルタを当てる
参照リンク
FFmpeg Filters Documentation :: lut, lutrgb, lutyuv
カラーバランス
赤緑青(RGB)それぞれを明暗別に色を調整する。暗いところだけを明るく、明るいところだけを暗くするなど ピンポイントで調整できる。明暗調整は上の mp フィルタよりもこちらを推奨。。RGB 変換が挟むので RGB 入力以外の場合はあまりお奨めしない。
すべての値は -1.0 から 1.0 まで 0.01 から指定でき、既定値は 0
マイナスの値で暗くし、プラスの値で明るくさせる。0 は効果無し
- rs, gs, bs
赤(rs) 緑(gs) 青(bs) の暗部だけを調整する - rm, gm, bm
赤(rm) 緑(gm) 青(bm) の中間部だけを調整する - rh, gh, bh
赤(rh) 緑(gh) 青(bh) の明部だけを調整する
赤緑青の暗部だけを少しだけ明るくする
-vf colorbalance=rs=0.02:gs=0.02:bs=0.02
赤緑青の明部だけを少しだけ暗くする
-vf colorbalance=rh=-0.01:gh=-0.01:bh=-0.01
赤緑青の暗部だけを少しだけ明るくし、赤緑青の明部だけを少しだけ暗くする
-vf colorbalance=rs=0.02:gs=0.02:bs=0.02:rh=-0.01:gh=-0.01:bh=-0.01
ffmpeg の出力例
ffmpeg -i input.mp4 -vf colorbalance=rs=0.02:gs=0.02:bs=0.02 output.mp4
参照リンク
FFmpeg documentation : : colorbalance
selectivecolor(特定色の調整)
colorbalance では RGB を明るくしたり暗くしたり出来たが、selectivecolor はより詳細に色の調整が出来る。
詳しくは RGB, CMYK を個別に調整できる selectivecolor を参照。
concat
映像だけ、音声だけ、映像と音声を一緒に後ろにつなげる。手元にあるファイルを配信を止めずに続けて配信するときに使う。
ffmpeg -hide_banner -stream_loop -1 -re -f concat -i input.ffconcat -c copy -f flv rtmp://ip-addr/live
input.ffconcatの内容。
ffconcat version 1.0
# コメント行 https://ffmpeg.org/ffmpeg-all.html#Syntax-1
file 1.flv
file 2.flv
file 3.flv
詳しくは【ffmpeg】動画・音声を連結する concat の使い方 其の3を参照。
pad
入力ソースに余白を作る。オーバーレイするときに解像度を拡張するときに使われる。
例
-vf "pad=width:height:x:y:color"
width:height は余白を含めた出力解像度。横:縦
x:y は左上隅を0:0として余白部分の解像度。横:縦
width - x = 入力ソースの横の解像度になる
height - y = 入力ソースの縦の解像度になる
color は余白の色。既定値は黒(black)。指定方法は色の名前指定かRRGGBB形式が使える。
FFmpeg Utilities Documentation :: Color
例
- 上に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw:ih+40:0:40" - 下に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw:ih+40:0:0"
ffplay -f lavfi -i testsrc -vf "pad=0:ih+40" - 右に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih:0:0"
ffplay -f lavfi -i testsrc -vf "pad=iw+40:0" - 左に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih:40:0" - 右下に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih+40" - 左上に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih+40:40:40" - 上下左右に40pxの黒の余白
ffplay -f lavfi -i testsrc -vf "pad=iw+80:ih+80:40:40"
iw と ih は入力データの横と縦の解像度。scaleやpad、cropで使われる。
オーバーレイとパドを使って横に2画面映像を付けることができる。注意点は同じ解像度であることと、最初に入力した動画の音声が流れる。
例:解像度半分に左右に配置
ffplay -f lavfi -i testsrc -vf "split[a][b],[a]scale=iw/2:ih/2,pad=2*iw:ih[left];[b]scale=iw/2:ih/2[right];[left][right]overlay=W/2:0"
例:解像度同じで左右に配置
ffplay -f lavfi -i testsrc -vf "split[a][right],[a]pad=2*iw:ih[left];[left][right]overlay=W/2:0"
ffmpeg の出力例
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "pad=iw:ih+40:00:40" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k hoge.flv
異なる音声を左右で流す方法はダウンチャンネルして左右に割り振るとできると思うが未確認。
できることを確認。2012年8月14日
例 infile1 を左に infile2 を右に解像度を半分にして音声も同様に配置
-i infile1 -i infile2 -filter_complex "[0:0]scale=iw/2:ih/2, pad=2*iw:ih [left] ;[1:0]scale=iw/2:ih/2 [right] ;[left][right] overlay=W/2:0; [0:1]pan=stereo:c0=c1[a];[1:1]pan=stereo:c1=c0[b];[a][b]amix"
このとき librtmp でライブストリーミングを取り込むと音声が早く終わることを確認。同期方法は未確認。
参照リンク
音声合成
音声ファイルや音声デバイスを合成(マルチトラックではない)する。-i で入力した音声を -map で指定しフィルターを掛けて合成することもできる。
詳しいオプション説明
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
- inputs[int]
取り込む音声の数
既定値:2
- duration[int]
複数の音声の再生時間が異なる場合にどちらの出力を優先するかのオプション
- 0, longest
長い方。既定値
- 1, shortest
短い方
- 2, first
最初に入力した方
- dropout_transition[float]
音声のエンコードが終わって他が続いている場合にその終わり方にフェードアウトする秒の指定
既定値:2
- weights[string]
取り込む音声の数
既定値:"1 1"
aundio1.m4a と aundio2.m4a を合成する例
-i aundio1.m4a -i aundio2.m4a -filter_complex amix -acodec
以下略
dshow の映像と2つの音声(PC音とマイク)を合成する例
-rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -f dshow -i audio="マイク (Realtek High Definition Au" -filter_complex amix -pix_fmt yuv420p -vcodec ... -acodec ...
以下略
video1.mp4 と video2.mp4 の音声を -map で指定してフィルターを掛けて合成する例
-i video1.mp4 -i video2.mp4 -filter_complex "[0:1] filter [L], [1:1] filter [R], [L][R] amix" -acodec
以下略
ここで dshow で音声を複数取り込む場合に何も指定しないと初期タイムスタンプが異なることになり、音声がずれる原因になる。その場合には asetpts=PTS-STARTPTS
フィルターを使う。効果は未確認。
asetpts は古い ffmpeg では使えない。
例
ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -f dshow -i audio="マイク (Realtek High Definition Au" -filter_complex "[0:1] aresample=44100,asetpts=PTS-STARTPTS [L]; [1:0] aresample=44100,asetpts=PTS-STARTPTS [R] ; [L][R] amix" -pix_fmt yuv420p
Libav documentation : : 19.19 overlay より
各入力映像から取られるフレームはタイムスタンプの順であることを意識すること。 したがって、それらの初期タイムスタンプが異なるなら、setpts=PTS-STARTPTS フィルターに通し、それらが同じゼロタイムスタンプから始まるようにして (movie フィルターの例で行っているように )2つの入力を渡すことは 良い考えである。
ちなみに似たようなフィルターに amerge がある。こちらも音声を合成するが、合成すると合成した分だけチャンネル数が増える。
参照リンク
- FFmpeg documentation : : amix
- FFmpeg documentation : : amerge
- Libav documentation : : setpts
- FFmpeg documentation : : asetpts, setpts
- 【ffmpeg】 マルチトラックの動画の作り方 -map の使い方はこちらを参照
サンプリング周波数の調整
入力した音声のサンプリング周波数を調整する。
例 入力した音声を44.1kHzに調整する
aresample=44100
soxをインストールしていれば
aresample=44100:resampler=soxr
ffmpeg の使用例
ffmpeg -i audio -filter_complex "aresample=44100" -acodec
以下略
参照リンク
FFmpeg documentation : : aresample
音声配置
音声のチャンネル配置、音量割合を変更する。
c0=左 c1=右
例 ステレオの左チャンネルを9、右チャンネルを1の割合で音量を変えてモノラルにする。合計は1になるようにする
pan=1:c0=0.9*c0+0.1*c1
例 左を無音にしてステレオを維持する
pan=stereo:c1=c1
例 右を無音にしてステレオを維持する
pan=stereo:c0=c0
各ステレオの音声 audio1 を左、audio2 を右に配置して音声合成
-i audio1 -i audio2 -filter_complex "[0:0]pan=stereo:c0=c1[a];[1:0]pan=stereo:c1=c0[b];[a][b]amix"
参照リンク
各チャンネルの音声を合わせたり調整する pan
AudioChannelManipulation – FFmpeg
音量調整
入力した音声の音量を調整する。既定値は1.0
自動的に音量に合わせて調整する場合は dynaudnorm を使う。
ffmpeg で聞き取りやすい音量に変える
音量を半分にする方法は2種類ありどちらも同じ結果になる
volume=0.5
volume=1/2
またデシベル指定で音量を調整できる
例 入力した音声の音量を12dB小さくする
volume=-12dB
例 入力した音声の音量を12dB大きくする
volume=12dB
ffmpeg の使用例
ffmpeg -f lavfi -i "amovie=audio,volume=0.5" -acodec
以下略
ffmpeg -i audio -filter_complex "volume=-12dB" -acodec
以下略
ffmpeg -i audio -af "volume=-12dB" -acodec
以下略
参照リンク
FFmpeg documentation : : volume
音量の圧縮・伸張
入力した音声から指定したデシベルを指定したデシベルに変換する。つまり、特定の音量を消したり(ノイズゲート)大きくしたり小さくしたりできる。
基本コマンド
-af "compand=attacks=0.3 0.3:decays=0.8 0.8:points=-90/-900 -34.6/-34.6 -22/-21:soft-knee=0.01:gain=0:volume=0:delay=0.8"
スペースの部分は | に置き換えることができる
-af "compand=attacks=0.3|0.3:decays=0.8|0.8:points=-90/-900|-34.6/-34.6|-22/-21: soft-knee=0.01:gain=0:volume=0:delay=0.8"
設定名は省略できる
-af "compand=0.3 0.3:0.8 0.8:-90/-900 -34.6/-34.6 -22/-21:0.01:0:0:0.8"
さらに 0.1 は .1 でも機能する。
-af "compand=.3 .3:.8 .8:-90/-900 -34.6/-34.6 -22/-21:.01:0:0:.8"
- attacks[string]
最大音量になるまでの秒時間が指定した時間以上のときにフィルタを当てる。0だと即時反映する。チャンネル毎に半角スペースか|で区切って指定する。チャンネル毎に指定しないときは最後の指定値が他の指定値になる
既定値:0(秒)
- decays[string]
attacks後の減退秒時間の指定。チャンネル毎に半角スペースか|で区切って指定する。チャンネル毎に指定しないときは最後の指定値が他の指定値になる
既定値:0.8(秒)
- points[string]
/の左が入力値、右が出力値の音量をdB単位で変更する。入力値は単調増加で出力値はそうでなくてもよい。|で区切って複数の支点を指定する
既定値:"-70/-70|-60/-20|1/0"
- soft-knee[double]
pointsの支点毎の音量変更の曲線をdB単位で指定する
範囲:0.01から900まで
既定値:0.01(dB)
- gain[double]
pointsで指定したデシベルの値のすべてに指定値だけ値を増やす
範囲:-900から900まで
既定値:0(dB)
- volume[double]
音量の初期値の指定。限りなく静かな音となる典型的な値は-90dBである
範囲:-900から0まで
既定値:0(dB)
- delay[double]
秒単位の遅延の指定。attackかdecaysとほぼ同じ値にすると反応モードではなく予測モードになり効果的に動作する
範囲:0から20
既定値:0(秒)
配信用途での基本設定は attacks, decays, delay を 0.1 に指定し、points でどの音量を上げ下げするかを指定する。ただし points で大きい音量を小さくするとダイナミックレンジが狭まるので gain で全体を下げた方が印象が良い。
-af "compand=.1 .1:.1 .1:-60/-100 -40/-40:1:0:0:.1"
問題は points をどのような値にすれば良いかだが、最初に自分の配信がどの程度のデシベルなのかを知る必要がある。
ffmpeg で調べる方法
ffmpeg で聞き取りやすい音量に変える
適切な音量が調べられる ffmpeg の ebur128 の使い方
この中から適当なのを選んで調べてみる。
水おいしいです^o^: 音量・レベルメータ ソフト
この中で WaveSpectra は使いやすくておすすめ。
高速リアルタイム スペクトラムアナライザー WaveSpectra
ダウンロードは下の方にある「WS151.ZIP をダウンロード」から保存する。
音声ファイルは .wav 形式だけが読み込める。PC上でリアルタイムに鳴っている音を解析するには設定から「再生/録音」タブより再生デバイスに音を鳴らすデバイスを指定し、録音デバイスをPCで鳴っている音を拾うステレオミキサーか仮想デバイスを指定する。ステレオミキサーがない人向けに今回は VB-CABLE を使う。
VB-Audio Virtual Apps
VB-CABLE Driver (Donationware) を保存し、32bit OS なら VBCABLE_Setup、64bit OS なら VBCABLE_Setup_x64 をインストールする。次にコントロールパネルの音声デバイスの 再生タブ の「CABLE Input」を有効にして 規定のデバイス にし、録音タブ では「CABLE Output」の録音デバイスの聴くタブから このデバイスで聴くにチェックを入れて その下のデバイス選択を普段聴いているスピーカーのデバイスを指定する。そして、WaveSpectra の録音デバイスには「CABLE Output (VB-Audio Virtual」を指定する。音が多重に聞こえる場合はこのデバイスで聴くにチェックを入れない。

波形を表示するには赤丸の録音ボタンを押すと波形が表示される。
特定の帯域を調べるには Spectrum タブの横軸より 範囲 にチェックを入れて指定範囲を指定する。
配信済みのタイムシフトの動画があるのなら ffmpeg で動画ファイルを解析して平均値と最大値を調べることができる。
ffmpeg -i video.flv -af volumedetect -vn -f null -
mean_volume が平均ボリューム(音量)で、max_volume が最大ボリュームになる。
astats でより詳しく調べられる。
ffmpeg -i video.flv -af astats -vn -f null -
ゲーム配信なら平均で -21dB から -23dB くらいに収まる放送が聞き取りやすく、最大は 0dB までだが、0dB 付近が頻繁に鳴るような放送は gain で全体を下げた方が良い。
お絵かき配信で BGM をかけてない場合は声か描いている音しかないので平均値が -30dB を下回ることがよくある。この場合に描いている音を消すこともできるし、増幅させて大きくさせることもできる。しかし、小さい音量を消す場合うまく調整しないと音の節々が途切れがちになり聞きづらくなるので非推奨。
同様に席を外すときにマイクをオフにし忘れて声漏れがする場合には小さい音量を一律に無音にしたり、何もしゃべってないときのマイクのノイズ をカットすることもできる。
マイクのノイズをカットする例
この設定でもマイクノイズが消えない場合は -60 を -50 に変更する。
- モノラルマイクの場合
-af "aformat=channel_layouts=1,compand=attacks=.1:decays=.1:points=-60/-100 -40/-40:soft-knee=1:gain=0:volume=0:delay=0.1"
- ステレオマイクの場合
-af "compand=attacks=.1 .1:decays=.1 .1:points=-60/-100 -40/-40:soft-knee=1:gain=0:volume=0:delay=0.1"
FFML の設定例
音声がマイクだけの場合
基本設定の音声デバイスにマイクデバイスを指定し、【FFMPEG】高度な設定タブの拡張タブから 手動設定で実行するにチェックを入れて、dshow の後ろにフィルタを追加する。

外部入力のゲーム音やPC上の音を背景にマイクの音をミックスする場合
基本設定の音声デバイスにゲームやPC音を拾うデバイスを指定し、【FFMPEG】高度な設定タブの複合フィルタの音声ミックスで音声ミックスを有効にするにチェックを入れて、追加メディアにマイクの音声デバイスを指定する。この場合 すべてフィルタは filter_complex で指定する ことになる。map 指定の方法も参照。音声デバイスの追加で新たに dshow を指定することになるがこの場合 rtbufsize は先に指定したのよりも少なめに指定 する。
-filter_complex "[1:0]aformat=channel_layouts=1,compand=attacks=.1:decays=.1:points=-60/-100 -40/-40:soft-knee=1:gain=0:volume=0:delay=0.1[1o];[0:1][1o]amix"

映像フィルタを指定する場合は map を指定する。
-filter_complex "[0:0]unsharp=3:3:0.5:3:3:0.5:0;[1:0]aformat=channel_layouts=1,compand=attacks=.1:decays=.1:points=-60/-100 -40/-40:soft-knee=1:gain=0:volume=0:delay=0.1[1o];[0:1][1o]amix"
参照リンク
- FFmpeg documentation : : compand
- [FFmpeg-user] Audio normalization using "volume" and "compand" filters
- FFmpeg Filters Documentation :: astats
- 偏ったDTM用語辞典 - ニー:Kneeとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software
- 小学生でも分かるデシベル(dB)の話
binaural(バイノーラル)
バイノーラルフィルタ。スピーカー以外の環境でスピーカーのように前方から音が聞こえるようにするフィルタ。zeranoe は対応しているがライブラリを別途インストールする必要があるのでビルドスクリプトが対応していないと導入が難しい。
コメント773 より、正しい解釈はコメントの通りで Wikipedia にもあるように「人間の頭部の音響効果を再現するダミー・ヘッドやシミュレータなどを利用して、鼓膜に届く状態で音を記録することで、ステレオ・ヘッドフォンやステレオ・イヤフォン等で聴取すると、あたかもその場に居合わせたかのような臨場感を再現」です。つまり一般的な視聴環境である スピーカーなどイヤフォンやヘッドフォン以外の環境では違和感があるかもしれません。
必要ライブラリは libsndfile と libbs2b。
- 公式サイト:libsndfile
- 非公式サイト:erikd/libsndfile
- 公式サイト:Bauer stereophonic-to-binaural DSP - Browse /libbs2b at SourceForge.net
- 非公式サイト:alexmarsev/libbs2b
基本コマンド
-af bs2b=fcut=700:feed=50
設定内容
- 既定値のプロファイル
-af bs2b=profile=default
fcut=700, feed=50
- Chu Moy のプロファイル
-af bs2b=profile=cmoy
fcut=700, feed=60
- Jan Meier のプロファイル
-af bs2b=profile=jmeier
fcut=650, feed=95
- fcut
カットする周波数(Hz)
- feed
どれだけ周波数をずらすか(Hz)。0 から 150 まで
大きい値ほど立体的になるが大きすぎると不自然に感じるかもしれない。
参照リンク
FFmpeg Filters Documentation :: bs2b
stereowiden(立体音響化)
両方のチャンネルに共通の信号を抑制し、左から右へ、またはその逆の信号を遅らせることによってステレオ効果を強化しステレオ効果を広げる。上の bs2b フィルタよりも手軽に立体音響っぽくするフィルタ。ネイティブフィルタなので別途ライブラリをインストールする必要が無い。変化した位相はaphasemeterフィルタで確認できる。
基本コマンド
-af stereowiden=delay=20:feedback=.3:crossfeed=.3:drymix=.8
設定内容
既定値のままだと音量が小さくなるので、drymix を上げるか、volume フィルタで音量を上げる。
- delay
遅延の設定。1 から 100 まで(単位ミリ秒)
この値を大きくすることで手軽に音の広がりが増す。
既定値:20
- feedback
feedback の音量。0 から 0.9 まで
既定値:0.3
- crossfeed
crossfeed の音量。0 から 0.8 まで
既定値:0.3
- drymix
音量の調整。0 から 0.9 まで
既定値:0.8
参照リンク
FFmpeg Filters Documentation :: stereowiden
入力フィルタの使い分け
- map 指定することで的確にフィルタを適用できる。
- フィルタ毎は , で区切り、別データを取り込むには ; で区切る。
- フィルタを通すと無圧縮データとして出力される。
- フィルタ内でファイルを取り込む movie|amovie を使うと無圧縮データとして入力される。
- フィルタの最初に[in],[0:0]などで外部から取り込み、フィルタの最後で[L][R][a0]などどして他のフィルタの目的とする。
- filter_complex
ffplay では再生できない
vf と af で同様の使い方ができる
filter の最後に [out] を付けない
複数の i を map 指定してフィルタを適用できる
映像フィルタと音声フィルタを同時に掛けられる
コマンド例
-i infile -filter_complex "<filters>"
-i infile1 -i infile2 -filter_complex "[0:0]<filters>[L];[1:0]<filters>[R];[L][R] overlay"
-i infile1 -i infile2 -filter_complex "[0:0]<filters>[L];[1:0]<filters>[R];[L][R] overlay;amix"
ffmpeg の出力フォーマットを SDL にすることで複数入力の filter_complex でもプレビューできる
-i infile1 -i infile2 -filter_complex "<filters>" -f sdl -
- vf,af
vf はビデオフィルタ
af はオーディオフィルタ
1入力1出力しか出来ないが、同じ入力なら split|asplit で増やすことが可能
af は ffplay で再生できない
i は最初に [in] でフィルタ内に取り込む
フィルタ内のデータの取り込みは vf は movie 、af は amovie フィルタを使う
ライブストリーミングを i と movie で同時に取り込むとそれぞれにラグが発生する
コマンド例
-i infile -vf "<filters>"
-i infile -vf "[in]<filters>[L];movie=infile ,<filters>[R];[L][R] overlay"
- lavfi
f は入出力フォーマットを決めるオプション
ffplay で複数のファイルを読み込むのに重宝する
フィルタ内のデータの取り込みは movie|amovie フィルタが使える
出力されるデータの映像は rawvideo、音声は pcm_f32le になる
filename
入力ファイル名、ローカルファイルだけではなく特定のプロトコルも入力できる
format_name, f
指定したフォーマットで読み込む。無指定だと入力ファイルから特定する
seek_point, sp
指定した秒から入力する。既定値は 0
streams, s
入力したストリームを特定する。dv が映像、da が音声。それぞれ入力する場合は + でつなげる
コマンド例
ffmpeg -f lavfi -i movie=infile:sp=3:s=dv+da[v][a];[v]trim=duration=2[out0];[a]atrim=duration=2[out1] outfile
ffplay -f lavfi -i movie=infile:s=dv+da[out0][out1]
-i video -f lavfi -i "amovie=audio1,<filters>[a0];amovie=audio2,<filters>[a1];[a0][a1] amix"
-f lavfi -i "color ,<filters>"
FFmpeg Devices Documentation : lavfi
注意点
テストの過程でわかったことの列記- PCが耐えられる以上のエンコード負荷をかけると音声が正しくエンコードされなくなる(音がプツプツになる)。
- 負荷が高いと配信fpsが指定fps以下になるので、その場合は解像度、fps、エンコード設定、libx264 の threads を論理コア数にする、ffmpeg の優先順位を見直す。
- ffmpeg で入力ファイルをデコードしてエンコードする場合には colormatrix を付けないと色がおかしくなる。
例:ffmpeg -i video.mp4 -x264-params "colormatrix=smpte170m" -vcodec ...
FFML を使って配信している場合は
高度な設定 タブ < コーデック タブ < x.264 形式のプリセット指定 (-x264-params) に colormatrix=smpte170m を入力する
訂正 2012/09/02
flash での再生確認では -vf colormatrix=bt601:smpte240m と -x264-params "colormatrix=smpte170m" は差がなかったが、directshow ベースの動画プレイヤーで再生すると前者は色が変わったので、後者に訂正した。
詳しい仕様については 金の髭さんのコメント505番 を参照ください。
未解決なこと
Dxtoryを入力ソースに使えない。avs経由だと読み込めないが、dshowだと読み込める。同様にXSplitもdshow経由だと読み込めるが凄まじく処理落ちする。
追記 2012年3月24日
PCのHDDをSSDに変えるとdshow読み込みでも処理落ちしなくなり、ゲーム配信ができるようになった。同時にNDCやSCFH DSFでも処理落ちしなくなった?
libavcodec will support Dxtory soon for playback
追記 2012年3月30日
激しく処理落ちする場合に -rtbufsize
を指定すると処理落ちが無くなる。とりあえず 102400000 を指定しておけば処理落ちはなくなった。dshow読み込みをせずにavs読み込みで -rtbufsize
を付けずにバッファーエラーが出ない場合は付けなくても良い。
例
ffmpeg -rtbufsize 100MB -f dshow -i video="Dxtory Video 1":audio="AmaRec Core Audio Capture" -r 24 -vcodec libx264 -crf 27 -acodec aac -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -f flv rtmp://...
【ffmpeg】 dshow 入力したソースを lavfi で使う方法がわからない → -filter_complex で amix を使うことで解決
追記 2012年8月4日 2013年7月30日
フィルターの使い分け
filter_complex, vf, af, lavfi
それぞれの使い分けかた。入力方法が少し違うのと ffplay で再生できるかに違いがあり、ffplay では2以上の同じタイプの入力ファイルを扱えない。filter_complex は2以上入力できるのに対して、vf, af は1つしか入力できない。lavfi はベンチマークがあまりよろしくない。
追記 2012年8月11日
音声デバイスを複数取り込んで amix する場合にそのデバイス間で音がずれることが確認されている。原因はそれぞれのデバイスに設定されているアロケーターサイズが異なるから。
詳しくは以下の放送を参照
ffmpeg単体でのステミキと音ずれ問題について - ニコニコ生放送
放送のスクリーンショット。サイズが大きいので画像リンク
lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_1
lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_2
lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_4
キャプチャを開始してすぐにエンコードをするのではなくて、-ss を指定してエンコード開始待ち秒(小数点可能)指定しアロケーターの開始位置が近しくなるようにエンコードしてみると、映像のオーバーレイの場合には同期できることが分かった。音声(amix)は未確認。
追記 2012年8月14日
overlay と amix を併用して librtmp でライブストリーミングを取り込むと音声が早く終わることを確認。同期方法は未確認。
参照リンク
[FFmpeg-user] How to set video size when using -f dshow?
その他の参照リンク
- 公式wiki
FFmpeg - wiki - FFmpegの公式ドキュメント
FFmpeg Documentation - FFmpegの公式ドキュメント日本語訳
Libav documentation : : - FFmpegのエンコード設定
PSP - Craving Explorer Wiki - FFmpegの掲示板(英語)
FFmpeg-users | Mailing List Archive - FFmpeg Metadata の記述方法
FFmpeg Metadata - MultimediaWiki - ffmpeg での配信方法公式wiki(英語)
StreamingGuide ? FFmpeg - FFmpegのコンパイル方法
猫とモブログと動画ブログのブログ
M.a.Factory社長日誌 : 検索結果 : MinGW
FFmpegのコンパイル (2011/07/31) w32threads お気に入りの動画を携帯で見よう - Linuxのffmpegで放送
streaming - RyoWiki
Linuxでニコ生配信する方法 | Yukke's Labo
ubuntu11.10でニコニコ生放送 - neCyda
備忘録 ubuntu10.10にWebcamStudio導入しUSTREAM放送をする。 ≪ Geroppa’s Blog
□LinuxでUstream(ffmpegで高解像度配信!?完結編) | Linux Install Memo
IEEE1394カメラとたった一行でUstream.tv高画質配信できた
Linux Kernel 2.6.38 と Webcamstudio でデスクトップ配信 - とりあえず暇だったし何となく始めたブログ
2008-11-26 - 夜間飛行
ffmpegでストリーミング配信 | ももーい鯖覚書
- Mac での配信
Macからffmpegを使って配信 - KILINBOX
ameroad.netで先行配信で購読してくれた2名の方ありがとうございました。無事に2012年3月5日の夜の公開に間に合いました。

ロベルト
お問い合わせはこちらまで
robelt2525[at]gmail.com
中の人 @nico_lab
広告リンク
Amazon
楽天市場
ブログ更新用 @blo_nico_lab
詳しいプロフィールはこちら
当ブログは、Amazonアソシエイトに参加しています。
コメント
金の髭
●ffmpegの-vf colormatrixは、色変換を行うもののようです。
例えば-vf colormatrix=bt601:smpte240mの場合、
BT.601のYUVデータをSMPTE240MのYUVデータに変換することを表します。
●-x264opts "colormatrix=smpte170m" は、
x264の--colormatrixと同じで、VUIのmatrix_coefficienttsを
指定するためのオプションです。要するに、
「これはこういう色空間でエンコードしたものだから
ちゃんとこの色空間でデコードしてね」
ということを明示しておくためのものです。
(これをちゃんと解釈してくれるかどうかはデコーダー次第ですが。)
●SMPTE240MはBT.601やBT.709とは異なる色空間です。
変換係数的にはBT.709にかなり近いのですが微妙に異なります。
参考:ITU-T H.264
http://www.itu.int/rec/T-REC-H.264
(2011年6月版のTableE-5 Matrix coefficients)
●-vf colormatrix=bt601:smpte240mだけをつけたものが
FlashPlayerで一見正常に見えたのは、
・色データはBT.601→SMPTE240Mに変換された。
SMPTE240MはBT.709に近いので、
これはBT.709でエンコしたものに近い。
・しかし-x264optsによるcolormatrixは付加されなかった
・FlashPlayerはcolormatrixがついていない場合は
BT.709だと解釈してデコードする。
・その結果、SMPTE240Mのデータ(BT.709に近い)が
BT.709としてデコードされたので限りなく正常に見えた
ということだと思います。
●-vf colormatrix=bt601:smpte240mがDirectShowベースのプレーヤーでおかしく見えたのは、
-x264optsによるcolormatrixの指定がなかったため、解像度から色空間を判断せざるをえず、
小さめの解像度だったのでBT.601だと判断してデコードしたためと思われます。
(BT.709に近いSMPTE240MをBT.601でデコードしたのでおかしくなった)
●-x264opts "colormatrix=smpte170m" で正しく見えるのは
色変換なしでそのままBT.601でエンコされたものが
colormatrixの指示によりちゃんとBT.601でデコードされるためです。
●ただしここまでの記述は -i video.mp4で渡すMP4が
BT.601でエンコードされていることを前提としています。
もしvideo.mp4がBT.709でエンコードされていると色が変わります。
●そのため、厳密に言うなら、正しい渡し方は
-x264opts "colormatrix=元のMP4の色空間"
ということになるかと思います。(smpte170m or bt709)
ただ、ニコ動向けのMP4は、ニコ動まとめWikiではBT.601でのエンコが推奨されていますので
多くのものはsmpte170mで問題ないとは思います。
2012/09/03 URL 編集
金の髭
●「YUV4:2:2で配信」のところでConvertToYUY2()が
ConvertYUV2()になってるところがあるようです。
●その部分の記述が
ImageSource("img.png", 0, 200, 20).ConvertToYUY2(matrix="rec709")
ffmpeg -i "img.avs" -x264opts "colormatrix=smpte170m" -vcodec libx264 -crf 1 output.flv
となっていますが、Rec709に変換したものにsmpte170mをつけているので、
これだと色がおかしくなります。正しくは
ImageSource("img.png", 0, 200, 20).ConvertToYUY2(matrix="rec709")
ffmpeg -i "img.avs" -x264opts "colormatrix=bt709" -vcodec libx264 -crf 1 output.flv
もしくは
ImageSource("img.png", 0, 200, 20).ConvertToYUY2(matrix="Rec601")
ffmpeg -i "img.avs" -x264opts "colormatrix=smpte170m" -vcodec libx264 -crf 1 output.flv
となるかと思います。
2012/09/03 URL 編集
ロベルト
「YUV4:2:2で配信」のところは訂正しました。
-vf colormatrix=bt601:smpte240m と -x264opts "colormatrix=smpte170m" の違いについてはもう少し調べてみます。
2012/09/03 URL 編集
少佐
-x264opts "8x8dct=1:deblock=0=0:psy-rd=0.5=0.0:qcomp=0.6"
の書式の例だと、deblockやpsy-rdの1つ目の項目は反映されますが、
2つ目の項目は正しく反映されないようです。
「:」区切りで書くため、「=」を「:」にすると当然エラーになります。
deblockやpsy-rdに関しては、「 -deblock -6:6 -psy-rd 1.0:0.0 」
のように、-x264optsの外で記述したほうが良いかと思われます。
2012/11/01 URL 編集
少佐
カンマ「,」区切りなら、2つ目の値も正しく反映されました。
-x264opts "8x8dct=1:deblock=0,0:psy-rd=0.5,0.0:qcomp=0.6"
のように書く感じになります。
2012/11/01 URL 編集
ロベルト
指摘ありがとうございます。訂正しました。
2012/11/01 URL 編集
少佐
「libx264: change i_qfactor to use x264cli's default」
2013/02/24 Michael Niedermayer git-a77a27a
「Merge commit '2f325a6fd4421c4dd4e26d7065e5d4bf26ed52f2'」
の2つのコミットにより、libx264の挙動が変化する仕様変更が行われたようです。
このコミット以前のビルドでは、「i_qfactor」の値は、
元々指定していても反映されない状態であったが、
このコミット以後のビルドでは、指定した値の「逆数」として反映されるようになりました。
(i_qfactor=1.4 の指定例だと、1/1.4=0.71というipratioの値になります)
項目として含めなければ、x264のデフォルト値の1.4になります。
「ipratio」の値が変更出来るようになったため、もし変更したい場合は、
指定したい値の「逆数」をとったものを、「i_qfactor」の値に指定する。
2013/04/07 URL 編集
ロベルト
報告ありがとうございます。記事に反映しました。
2013/04/07 URL 編集
少佐
先日たまたまデロゴフィルターを設定してみる機会があったときに発見しました。
FFmpegの古いバージョンだと、以下の(A)の指定でエラーなく除去できますが、
(A)-vf "delogo=460:290:114:32:0" / 640x360 の解像度
FFmpegのバージョンが新しいとエラーになりました。(2.3.1で試しました)
おそらくどこかの更新で、バンドの指定範囲が変わったようです。
(B)の例のようにしたらエラーなくできましたので、一応報告しておきます。
(B)-vf "delogo=460:290:114:32:1" / 640x360 の解像度
2014/08/11 URL 編集
少佐
ちょっと履歴みたところ、以下のコミットのタイミングで修正されたようですね。
https://github.com/FFmpeg/FFmpeg/commit/4e10d87f384a11b11034349e441f76207275c756
2014/08/11 URL 編集
すぺt
立体的にするのではなく、ヘッドホンなどで聞く場合の音の定位を前面に補正するというのがどうも正しい解釈のようです。
スピーカーで再生する場合はスピーカーの位置が人の前面にありますが、ヘッドホンだときっちり左右に音が分かれてしまうので、それをスピーカーで聞くときのように前面から聞いているような補正をする・・・というイメージではないかと思います。
2015/10/19 URL 編集
ロベルト
記事に反映しました。
2015/10/20 URL 編集