Windows の ffmpeg で生放送する方法

この記事はAvisynth を使った上級者向けの配信方法でしたが、FFML(FFMPEG Launcher)を使うことで Avisynth を使わないほうが手軽で安定して配信できるようになりました。

この記事は FFML を使わない方法をメインに書いているのでコマンドを書く作業が多くなります。そしてエラーは英語表示なので英語が読めて、動画に関する知識があり、かつ自己解決出来る人が望ましいです。

こちらの記事で Avisynth を使わずに手軽に配信する方法が紹介されています。

Avisynth を使う(avs読み込み)方法と使わない方法の違いは dshow 読み込みと avs 読み込みの違い で説明しています。



目次



メリット・デメリット


メリット

  • 無料
  • 配信できるコーデックが多種多様
  • 64bit ffmpegが使える
    32bit ffmpeg より1割程度高速化する
  • 最新版の ffmpeg(libx264)が使える
  • ビットレートは自由に設定できる
  • YUV4:2:2が使えて色(特に赤色)の劣化が少ない(ニコ生は不可)
  • HE-AACや音声48KHz配信ができる
  • XSplit を映像デバイスに使うことができる
  • Ustream, Twitch にワンクリックで配信開始できる
  • ニコ生の無劣化ミラー配信(PC負荷はかなり少ない)ができる
  • 動画ファイルを再エンコードなしの配信ができる
  • ffmpeg(libx264) の最適化ができる
  • ffmpeg のフィルタが使える
  • ffmpeg 自体にステレオミキサーの機能がある
    音声合成 を参照
  • avisynth のプラグイン、フィルタが使える
  • 詳細なエンコードログが見られるので設定を煮詰めやすい

デメリット

  • 配信ツールの基礎知識がいる
  • 配信先が固定でないニコ生だと少し手間が掛かる
  • 入力デバイスが必ずしも読み込めるとは限らないかもしれない
  • 64bit ffmpeg を使用するとAvisynthを使わない場合、読み込めるデバイスが少なくなるが 代替方法 あり
  • x264 で使えるが libx264 では使えないオプションが一部ある

FMLE 3.2, XSplit 2.x, NLE 2.0.2, ffmpeg, OBS の比較


FMLE 3.2XSplit 2.xNLE 2.0.2FFmpegOBS
料金無料有料と無料無料*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
配信ログ出力×××
ドロップ数表示×
メディアファイル再生×
画像表示×
テキスト表示×
*1 ダウンロードとインストールはできるが起動にはニコニコ動画のプレミアムアカウントが必要
*2 無料ユーザーはモノラルに限定される
*3 自分でビルドする必要があり以下を参照
HE-AAC が使える ffmpeg をつくる方法【ffmpeg】 fdk-aac を ffmpeg に組み込む
*4 配信中はリアルタイムに調整できない。別途ミキサーなどで調整する
*5 単体では配信とは別にエンコードして出力するのでPC負荷が高くなる
複数サイト同時配信(配信と録画) より配信しながら、別にエンコードせずに配信データを保存できる

XSplit の無料と有料の比較は公式サイトに載ってある。
XSplit - ライセンスを入手

配信負荷について


起動するツールが ffmpeg と映像キャプチャだけなのでCPU負荷はほとんでエンコーダーに振ることができ、XSplit よりも同程度のエンコード設定ではCPU負荷は小さくなる。ただしメモリ消費量は Avisynth を使う方法と ffmpeg(FFMPEG Launcher, FStream) を使う方法で大きく異なり、Avisynthを使う場合には ffmpeg よりも4倍から5倍程度多い。また ffmpeg のエンコード負荷が高くなるほどメモリ消費量は多くなるが、64bit版の ffmpeg では 32bit よりも少なくなる。

使用ツール



準備手順


GraphStudioでデバイスを読み込む


GraphStudioを起動してCTR+FでFiltersが立ち上がり、Video Capture Sources を選択すると、インストールされている映像デバイスが表示される。試しにNDCを選択して中下にInsertのボタンがあるのでこれを押して右上の×を押す。

ffmpeg_ (3)

するとNDCだけが表示されるがここでファイルをCTR+Sで保存する。ファイル名は便宜上ndcにして拡張子は自動的にgrfが付く。ここでNDCだけではなくNDCの後ろにレンダーをつなげることでプレビューが出来る。NDCの右にCaptureと書いてある出っ張りを左クリックして Render Pin をクリックすると。レンダーまで連結される。

ffmpeg_ (8)

ここで上の ? を押すと再生されてNDCのプレビュー画面が表示される。

ffmpeg配信ではこのように最後のレンダーを表示させるのではなくて、NDCなどの入力デバイスだけを表示してgrfで保存することを忘れないようにする。

同様に音声デバイスも Audio Capture Sources から取り込んで入力デバイスだけをgrfで保存する。

ffmpeg_ (6)

参照リンク

avsファイルを作る


メモ帳などで映像と音声デバイスを一つのavsに書きこんでgrfファイルを読み込ませる。
Windowsの標準メモ帳では保存するときにファイルの種類を すべてのファイル(*.*)を選択してndc.avsなどと保存する。


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)


まず重要なのがfpsの値、映像と音声の値を一致させること。次に映像デバイスにはaudio=falseに、音声デバイスにはvideo=falseにしてそれぞれ単独でデバイスを読み込ませてAudioDubする方法を取る。framecountはfpsと関係があり、36000/20=1800 つまり1800秒(30分)となり1800フレームエンコードすると自動的に配信がストップする。

videoソースの最後に512x288にリサイズしているが、NDCやSCFHでリサイズするよりもAvisynthでリサイズするほうが映像ソースに合わせてリサイズオプションを変えられるので綺麗にリサイズできる。そして最後にファイル名をndc、拡張子をavsにして保存する。

avsファイルの動作確認にgraphstudioかffplayを使う。
graphstudioはavsファイルをそのままD&Dして?ボタンを押すと再生。ffplayはavsファイルをD&Dするかコマンドはから起動する。

ffplay input.avs

参照リンク

ffmpegのオプション


ffmpegはavsファイルを読み込んで映像と音声のエンコード設定を決める。まずはコーデック自体のオプションの説明の前に基本的なオプションの説明。

OptionMemo
vn指定すると映像無効化
an指定すると音声無効化
vcodec映像コーデックの指定 c:v でも可能
acodec音声コーデックの指定 c:a でも可能
f入力・出力のフォーマット指定
y同じファイル名があったら上書き
reコピー配信やファイル配信する場合につける
rfps フレームレートを下げるときにつける
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 などを指定する

libx264のオプション


ffmpeg で使われるコーデックの libx264 は x264 と少し記述方法が異なり、一部使えないオプションがあるので注意が必要。基本オプションから別途追加修正する。配布しているffmpegによってはデフォルトの設定が異なる場合がある。また auto 指定はできないので実数を指定する


-vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m"
x264FFmpegDefaultMemo
8x8dct8x8dct1high プロファイル専用
aq-modeaq-mode20:none 1:AQ to redistribute
2:Auto-variance AQ
3:Auto-variance AQ with bias to dark scenes
aq-strengtaq-strength1
b-adaptb_strategy1
b-biasbframebias1
b-pyramidb-pyramid1bframes:2以上でかつ、refs:2以上
0:none 1:strict 2:normal
bframesbf2
bitratebt
cabaccoder1
chroma_menone1
chroma-qp-offsetchromaoffset-2
constrained_intra0
cplxblurcplxblur0変更できない
cqmnone
cqpfilenone0
crfcrf23
deadzone-internone21
deadzone-intranone11
deblockdeblock0:0オフは -x264-params no-deblock
decimatenone11
directdirect-pred10:none 1:spatial 2:temporal 3:auto
fast_pskipfast-pskip1
interlacednone0
intra_refresh0
ipratioi_qfactor1.41に指定した値を割った数値が指定される
keyintg250
levellevelffmpegでは10倍指定にする
mbtreembtree1
meme_methodhex
diaepzsdia でも可能
hexhex
umhumh
esafullesa でも可能
merangeme_range16
min-keyintkeyint_min25実数を指定する
keyint_min:0 でfps値に自動設定
mixed-refsmixed-refs1要 ref:2 以上
mvrangenone
no-chroma-menone
no-dct-decimatenone
nrnone0
open_gop0
partitionspartitionsp8x8,b8x8,i4x4,i8x8
allallp8x8,b8x8,p4x4,i8x8,i4x4
p8x8p8x8
b8x8b8x8
p4x4p4x4
i8x8i8x88x8dct:1 と併用する
i4x4i4x4
passpass
pbratiob_qfactor変更できない
pre-scenecutnone
presetpresetmediumultrafast veryfast faster fast
slow slower veryslow
profilevprofilehighprofile:v でも可能
baseline main high
psypsy1
psy-rdpsy-rd1
qblurqblur
qcompqcomp0.6
qpqp0で可逆圧縮
crf=0 が可逆圧縮なのは 8bit まで
qpfilenone
qpmaxqmax69
qpminqmin0
qpstepqdiff4
ratetolbt
rc_lookaheadrc-lookahead40rc_lookaheadだと反映しない
rceqrc_eq
refrefs3
scenecutsc_threshold40
sliced_threadssliced-threads0
statsnone
submesubq7subme:10 以上は trellis:2 を指定する
threadsthreads0
trellistrellis1trellis:2 は subme:6 以上
tunetunefilm animation grain stillimage
psnr ssim fastdecode zerolatency
vbv-bufsizebufsizemaxrate と併用する
vbv-initrc_init_occupancy0.9
vbv-maxratemaxratebufsize と併用する
weightbweightb1
weightpweightp20:none 1:strict 2:normal
zonesnone
mbd0マクロブロック判定 0,1,2
qsquish0
qns0

詳細は以下を参照。

追記 2015/02/14
FFmpeg Codecs DocumentationThis option is functionally the same as the x264opts, but is duplicated for compatibility with the Libav fork より、x264opts から x264-params に変更した。

ffmpegで x264 のオプションも使うことができる。ffmpeg の後に -x264-params を使う。注意点は一部使えないオプションがある。使えないオプションは、direct=auto、min-keyint=auto、profile 。なので direct、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 libvo_aacenc -ar 44100 -ab 80k -f flv rtmp://...

XSplitやNLEとの違いにcrfの効き具合に差がある。XSplitで crf=25 (XSplitでは品質10)を指定していた場合にffmpegでも同じエンコード設定にして crf=25 を指定しても同じようなビットレートで配信できないことが多い。よって crf の値を小さくするか maxrate を上げる。

訂正 2012年11月1日 反映されない設定を直した
-x264-params の中で deblock=0=0 と、psy-rd=0.5=0.0 は注意が必要で、このままだと deblock は前の値が後ろの値と同じ値になるのと、psy-rd は後ろの値を書き換えても反映されないので次の2通りのどちらかにする。
  1. 2つ目のオプションを「,」で区切り deblock=0,0:psy-rd=0.5,0.0 として設定
  2. -vcodec libx264 のオプションで -deblock 0:0 -psy-rd 0.5:0.0 として設定

もう一つ注意点があり
x264のエンコードでエラー(Error while opening encoder for output stream #0.0) お気に入りの動画を携帯で見よう よりlibx264やx264-paramsの設定が以下の値の5つ以上一致するとエラーになる。

(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つ以上デフォルト値の場合にエラーで終了します。


参照リンク

音声コーデック


生放送で使える音声コーデック一覧
コーデック名オプション名
Speexlibspeex
Nellymosernellymoser
MP3libmp3lame
AAC-LCaac
libvo_aacenc
libfdk_aac
HE-AAClibaacplus
libfdk_aac
HE-AAC v2libfdk_aac
HE-AACは特別にffmpegを自分で作らないと使えない
作り方は HE-AAC が使える ffmpeg をつくる方法【ffmpeg】 fdk-aac をffmpeg に組み込む を参照

音声コーデックの基本オプションは共通
ただしlibvo_aacenc, nellymoser, libaacplus では-aqが使えない
オプション名意味使い方例
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で約+6dB

音声コーデックとビットレートの目安
周波数(kHz)チャンネル数ビットレート(kb/s)
Speex1618~36
HE-AAC v222.05~44.1212~48
Nellymoser22.05136~48
MP322.05148~64
HE-AAC v144.1248~80
MP344.11or264~80
MP344.1280~320
AAC-LC44.12128~320
libaacplus は HE-AAC v1 と HE-AAC v2 に指定したビットレートで自動的にコーデックが変わる。注意点は73k以上指定するとエラーになる。
FDK-AAC の使い方は 【ffmpeg】 fdk-aac を ffmpeg に組み込むAACEncodingGuide ? FFmpegFFmpeg documentation : : libfdk_aacFraunhofer FDK AAC - Hydrogenaudio Knowledgebase を参照。

FDK AAC はソースコードに推奨設定が書いてある。
AAC LC + SBR + PS が、HE-AAC v2, AAC LC + SBR が HE-AAC v1 である。
fdk-aac/aacenc_lib.h at master · mstorsjo/fdk-aac

ビットレートの上限や下限はエンコーダーやコーデック、周波数で異なるので、指定した値でもそのとおりに出力されない。例えば周波数44.1kHzを22.05kHzにすると上限ビットレートは半分になる。

周波数44.1kHz、2ch の場合
上限は faac は 152k、vo-aacenc は 320k、fdk-aac(LC) は 530k まで、fdk-aac(HE) は 128k まで、fdk-aac(HEv2) は 64k まで。
下限は fdk-aac(LC) は 12k まで、fdk-aac(HE) は 16k まで、fdk-aac(HEv2) は 12k まで。

使い方例
-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 libvo_aacenc -ar 44100 -ab **k
-acodec libaacplus -ar 44100 -ab **k
-acodec libfdk_aac -profile:a [aac_low or aac_he or aac_he_v2] -ab **k -ar 44100


優先順位の変更


コマンドからffmpegの実行優先順位も変更できる
オプション名優先度
/high
/abovenormal通常以上
/normal通常
/belownormal通常以下
/low


start /high ffmpeg ... 以下略

ffmpegのリサイズオプション


ffmpegのリサイズには -s(-vf scale) が使われるが、リサイズのオプションも変更することができ、何も指定しないと bicubic でリサイズされる。

accurate_rnd は他のオプションに前につけて + でつなげる。すると少しssim値が大きくなる(リサイズをシャープにしない)。シャープになるほどcrfを固定してエンコードした映像のビットレートは高くなり、ssim値は小さくなる。3Dの複雑な映像ほどシャープにするとビットレート制限化ではビットレートが足りなくなるので、適宜リサイズオプションを変えてみて自分の配信に最適なオプションを探す。

グラフは下に行くほどシャープになり、neighbor は必要以上にシャープなのでおすすめしない。
オプション名メモ
accurate_rnd+bilinearぼんやり
bilinearぼんやり
experimentalややぼんやり
bicubicややシャープ
splineややシャープ
accurate_rnd+lanczosシャープ
lanczosシャープ
neighborかなりシャープ

accurate_rnd は ffdshow では「正確な丸め処理」と表記されている。ビットレートとPCスペックに余裕が有るのなら accurate_rnd+lanczos リサイズがおすすめ。ビットレート制限がきつい場合は accurate_rnd+bicubic リサイズがおすすめ。

基本的には bilinear、 何も指定しない(bicubic)、 lanczos のどれかを指定する。
映像キャプチャの解像度はオリジナルの解像度を指定して、このffmpegのオプションでリサイズする。

追加ライブラリで zscale が使えるようになり、scale の lanczos の代替として spline16, spline36 が配信用におすすめ。scale ほど処理速度が出ないが、リアルタイムエンコードなのでそれを下回らない限りあまり気にすることはない。 また scale を使わないので accurate_rnd も使えない。


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 libvo_aacenc -ar 44100 -ab 80k -f flv rtmp://...

ちなみにscaleフィルターでリサイズ指定しても同じ結果になる。
-vf scale=512:-1 の縦幅を -1 に指定することで、横幅512ピクセルに縦をアスペクト比固定で動的に指定できる。また横幅を -1 にしても同じように縦幅を自動指定できる。


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 libvo_aacenc -ar 44100 -ab 80k -f flv rtmp://...

参照リンク

音声デバイスのバッファサイズ


音声デバイスの1ミリ秒あたりのバッファサイズ。規定値はその音声デバイスのバッファサイズで基本的には変更しなくて良い(追加しない)。値を小さくし過ぎるとパフォーマンスが悪くなる。

設定方法は -i より先、ここでは -f dshow の次につけて、その後ろの音声デバイスのバッファサイズを指定する。
-f dshow -audio_buffer_size 40 -i audio="XSplitBroadcaster"

この設定を変える必要があるのは、複数の音声デバイスを -f dshow で取り込み amix で音声をミックスし、それぞれの音声が同期できない時である。推奨値はそれぞれの音声デバイスの組み合わせなので試行錯誤するしかない。

複数の音声デバイスを amix で取り込む例
予めサンプリング周波数を揃えておいたほうが良い

-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

技術的な話は Setting Audio Capture Properties (Windows) を参照。

参照リンク
FFmpeg Filters Documentation - amix

外部ツールから簡単配信をする


H.264配信(x264)は上のオプションを記述するが、H.263の場合は記述方法が少し異なる。

映像コーデック指定は flv で他に必須オプションは -b:v と -q:v である。その他は上のx264のオプションを使うが一部使えないかもしれない。

  • -b:v はビットレート
  • -q:v は品質、数値が小さいほど高品質


-vcodec flv -b:v 300k -q:v 20

コマンドプロンプトから毎回起動するのに便利な以下のバッチ(cmd.bat)をffmpegと同じフォルダ内に置くと便利。すぐ下にバッチファイルを配布。
32bitOSなら
"C:WINDOWSSystem32cmd.exe"

コマンドを実行するには cmd.zip を保存し ffmpeg と同じフォルダ内に解凍して、cmd を実行し、コマンドをコピペすればコマンドラインから ffmpeg を実行できる。

配信方法


各配信サイトにffmpegで接続する


ffmpegでrtmp配信するにはコマンド末尾に -f flv rtmp://... を付ける。
後述するTCPRelayの使い方も必ず参照してください。

ニコ生で配信する


配信画面から外部ツール配信を選択して URL と stream を / でつなげる。

ニコ生での配信例

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

Ustreamで配信する


番組設定 のページから左下の ライブ配信設定 から エンコーダー設定。

ffmpeg_ (5)

RTMP URL と ストリームキー を / でつなげ、その後ろに offair flashver=FME/3.020(compatible;20FMSc/1.0) をつなげて""で囲む。

Ustream での配信例

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)"

Twich で配信する


http://twitch.tv/broadcast/dashboard/streamkey から show Key で key を表示して、東京サーバの rtmp://live-tyo.twitch.tv/app/ と組み合わせる。

TwichTV での配信例

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

NDC, SCFH DSF, SCFF を使った配信


ffmpeg のオプションで入力解像度や入力フレームレートを設定できる。下のレジストリを書き換える方法は常にその設定になるのに比べて、この方法はコマンドを書き換えることで手軽に設定を変えることができる。

NDC,SCFH DSF の他に SCFF もオプションから変更できる。

設定方法は -i より先、ここでは -rtbufsize の次に -s 横x縦 -r フレームレート を設定する。

解像度 640x360 24fps の入力設定
ffmpeg -rtbufsize 100MB -s 640x360 -r 24 -f dshow -i video="SCFH DSF"

SCFF の場合はこのようにはせずに、DirectShow のオプションを使う。上の使い方だと入力時に処理落ちした場合に処理落ち分を換算しないために音ズレが発生する。
ffmpeg -rtbufsize 100MB -f dshow -video_size 640x360 -framerate 24 -pixel_format yuv420p -i video="SCFF DirectShow Filter"

Alalf/SCFF-DirectShow-Filter · GitHub
スクリーンキャプチャソフトを作るスレ 2
FFmpeg documentation : : dshow

レジストリを書き換える方法


  • NDCを使って映像を取り込む場合にはレジストリを書き換えて取り込み解像度を変更する。配信には取り込む映像の解像度に合わせたほうが高画質に配信できる。

    Winボタン + R から ファイル名を指定して実行 を起動して、regedit と書いてレジストリエディタを起動する。

    場所は
    HKEY_CURRENT_USERSoftwareConsolasNDC(XP)

    DefaultOutputSizeHeight が高さで10進数に変更して取り込む映像ソースの解像度に合わせる。
    DefaultOutputSizeWidth が幅で10進数に変更して取り込む映像ソースの解像度に合わせる。
    ffmpeg_ (11)


  • NDC Ver1.20 (2015/02/27) ではレジストリを書き換えなくても入力解像度やフレームレートの指定が出来るようになっている。
    ただし解像度は 1024x768 まで、フレームレートは 60.0002 まで。
    ffmpeg -rtbufsize 100MB -s 640x360 -r 24 -f dshow -i video="NDC(XP)"

  • SCFH DSFを使って映像を取り込む場合もレジストリを書き換えて取り込み解像度とfpsを変更する。一度ffmpegでSCFH DSFを起動していないとレジストリが作られてないので予め SCFH DSF を使って起動しておく。

    場所は
    HKEY_CURRENT_USERSoftwareSCFH DSFffmpeg.exe

    Framerate はfpsで出力fpsと同じ値にする。HeightとWidthは高さと幅で取り込む映像ソースの解像度に合わせる。
    ffmpeg_ (2)

動作確認メモ google docs で公開してます。

avs ファイルでデバイスを取り込む


所有しているデバイスがI-O DATA GV-USB, HDGRAB しか保有してなく他が確かめられないので動作確認できたデバイスがありましたらコメントお願いします。

HDMIやUBSキャプチャーで映像を取り込む方法は2種類あり、graphstudioでそのデバイスを取り込む方法と、アマレコ TV Liveなどの外部デバイスで取り込む方法がある。音声を取り込む方法は3種類あり、graphstudioでそのデバイスを取り込む方法と、アマレコ TV Live経由で取り込む方法、ステレオミキサーで取り込む方法がある。

私が所有しているI-O DATA GV-USBではgraphstudioで取り込めなかったので映像はアマレコ TV Live経由で取り込み、PC上で鳴っている音を取り込む方法をとった。

Amareco Video CaptuerとAmareco Audio Captuerを別々にgrf保存して

video = DirectShowSource ("avc.grf", fps=30, audio=false, framecount=54000)
audio = DirectShowSource ("aac.grf", fps=30, video=false, framecount=54000)
AudioDub (video, audio)


もうひとつの方法はデスクトップの映像を配信する場合と同じでPC上の音声を取り込む方法。

video = DirectShowSource ("avc.grf", fps=30, audio=false, framecount=54000)
audio = DirectShowSource ("mic.grf", fps=30, video=false, framecount=54000)
AudioDub (video, audio)


アマレコ TV Liveの設定は以下のとおり。マイクとゲーム音をミックスするする場合はここでミックスする。



GraphStudioでGV-USBを読み込むと色がYUY2になっているのが分かる。


動作確認メモ google docs で公開してます。

参照リンク
Ama Rec TV LiveVer2.20a オンラインヘルプ

Past duration too large のエラーを消す


2015年の1月17日の ffmpeg のコミットでからこのエラーが発生するようになったので、そのエラーだけを非表示にする方法。
該当コミット:ffmpeg: Maintain higher precision pts between video filter and fps code : git.videolan.org Git

ここより解決方法を引用:#4401 (Past duration too large) – FFmpeg

FFmpeg-modified-v2 を使っている場合はエラーは出なくなっている
modified-v2について:FFmpeg-modified-v2の実験 - ブロマガ

入力データの前に -vsync passthrough または -vsync passthrough -frame_drop_threshold 4 をつけるとエラーが発生しなくなる。
ffmpeg -rtbufsize 100MB -vsync passthrough -frame_drop_threshold 4 -f dshow -video_size 640x360 -framerate 24 -pixel_format yuv420p -i video="SCFF DirectShow Filter"

ffmpeg Documentation

低ビットレートで高画質に配信


ビットレートが足りない映像(fpsなどのゲームや車載配信、野外配信)では解像度を小さくするか、映像部分を小さくして周りに余白を付けると見栄えが良くなる可能性がある。

FFMPEGLauncher を使う場合、設定する出力解像度がないので FFMPEGLauncher.config.xml をメモ帳などで開いて 384x216,448x336 を追加する。

<outputsize value="320x240,384x216,448x336,480x360,512x288,512x384, 以下略" />

FFMPEGLauncher を使う場合に、scale ,pad を併用するときは、出力解像度が pad=横:縦 で表示されるのでそれを出力解像度に指定して、【FFMPEG】高度な設定 < 共通設定タブの左下の映像 < フィルタを有効にする の下の部分に scale=448:336,pad=512:384:32:24 等と記入する。実際にこの方法を使う場合は pad の前に unsharp などの映像フィルタを挟む方が、pad の後ろよりも低負荷になる

scale しか使わない場合は フィルタを有効にする の下の部分に何も記入せずに、scale=横:縦 の値を出力解像度に指定する。-sws_flags は リサイズオプション になっていて、それぞれにチェックを入れる。

  • 4:3 のオススメ設定 その1
    出力解像度512x384 周りに黒縁がつくのが特徴
    -vf scale=448:336,pad=512:384:32:24 -sws_flags accurate_rnd+lanczos
  • 4:3 のオススメ設定 その2
    出力解像度448x336 PC負荷が小さくなるのが特徴
    解像度を小さくしてプレイヤーの画面いっぱいに表示させる方法
    -vf scale=448:336 -sws_flags accurate_rnd+neighbor
  • 16:9 のオススメ設定 その1
    出力解像度640x360 で映像部分は 512x288 周りに黒縁がつくのが特徴
    -vf scale=512:288,pad=640:360 -sws_flags accurate_rnd+lanczos
  • 16:9 のオススメ設定 その2
    出力解像度512x288 で映像部分は 461x259 周りに黒縁がつくのが特徴
    元の映像のアスペクト比が少し異なっているが違和感を感じるほどではない
    -vf scale=461:259,pad=512:288 -sws_flags accurate_rnd+lanczos
  • 16:9 のオススメ設定 その3
    出力解像度512x360 でプレイヤーの仕様で横に広がって640x360 に見える
    -vf scale=512:360

詳しい設定方法は scalepad を参照。

動画、音声ファイルを使った配信


動画配信サイトによっては制限ビットレートがあるが、ffmpeg では高ビットレートで配信してもデータの送信方法に問題があり、高ビットレートで配信できないので TCPRelay を使う(低ビットレート制限を回避するものではない)。TCPRelay の使い方 は後述する。注意点は ffmpeg でファイルを元に配信する場合には必ず -re を最初につける。-re を付けないと配信fps以上の転送を行い配信途中でエラーになって止まったり、放送を終了しない限り途中で再生を止めてもそこで配信が止まらなくなる。

ニコ生の制限ビットレート以内で再エンコードしない場合は

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://...

入力ファイルは mp4 や flv などフラッシュで再生できるコーデックならそのまま -copy で出力できるが、swf は入力できない。

映像と音声が付いている動画で音声だけをコピー配信する場合は

ffmpeg -re -i "input.mp4" -vn -acodec copy -f flv rtmp://...

複数のファイルを連結して一度のエンコードで配信する場合は concat を参照。

その他に動画ファイルの直リンクも映像ソースにできる

ffmpeg -re -i "http://hoge.net/huga.mp4" -codec copy -f flv rtmp://...

音声だけ(ラジオ)配信


音声だけの配信する場合に音声デバイスを取り込む方法が2種類あり、

ffmpeg の dshow (FFMPEG Launcher がこれ)で取り込む方法と
ffmpeg -f dshow -i audio="AmaRec Core Audio Capture" -acodec libvo_aacenc -ar 44100 -ab 128k -f flv rtmp://...

映像デバイスと同様にavsで読み込んで映像をオフ(-vn)にする方法がある。
ffmpeg -i "ndc.avs" -x264-params "colormatrix=smpte170m" -vn -acodec libvo_aacenc -ar 44100 -ab 128k -f flv rtmp://...

どちらでも配信ができるが、直感的にわかりやすい前者の dshow 読み込みがオススメ。デバイス名はffmpegのコマンドから調べる。これで調べて日本語が文字化けする場合はffmpegの dshow 読み込みはできないかもしれない。その方法はavs読み込みの方法と、dshow 読み込みの場合は文字化け対策をする方法と、デバイス名を半角英数字にする方法がある。

ffmpeg.exe -list_devices true -f dshow -i dummy

画像をつけた音声だけ(ラジオ)配信


この項目はいわゆる雑談放送でよく用いられる画像とマイクを取り込んで配信する方法である。

まず最初に配信先の画面より画像の解像度が大きい場合は画像の解像度を配信先の画面に合わせてRalphaを使ってリサイズする。

窓の杜 - Ralpha
マルチコア対応で画像リサイズ・フォーマット変換などの一括高速処理が可能なフリーソフト「Ralpha」 - GIGAZINE

次に上の 音声だけ(ラジオ)配信 を参考に音声デバイスを決める。

画像はjpgやpng、bmp、gifなどが読み込めるがアニメーションGIFは一枚画像でしか読み込めない
2015年現在はアニメージョンGIFは全てのフレームを読み込める。


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://...

日本語デバイスを読み込むには


デバイス名の日本語が文字化けする場合にはコマンドプロンプトを起動して、タイトルバー右クリック < プロパティ < フォントタブ < 文字コードをMS ゴシック に変更して、コマンドに chcp 65001 を打って文字コードをUTF-8にする。元に戻すには chcp 932 と打つ。これで日本語のデバイスも dshow で読み込めるようになる。

それ以外の方法ではデバイス名を半角英数字にして文字化けを回避する方法もある。
29-06-2012 22.55.01

参照リンク
コマンドプロンプトでUTF-8の文字を表示する - サンプルコードによるPerl入門

ミラー配信


この項目はニコ生の放送をニコ生や Ustream、Twitich 等にミラー配信する方法である。

  1. FFMPEG Launcher を使ってミラー配信する方法
  2. 【VLC】 放送中のニコ生を視聴する方法 を参考にしてニコ生対応の rtmpdump と NCV、NCVRTMPDumpWrapper を使ってミラーする方法
  3. ffmpeg 単独で取り込んでミラーする方法
  4. 外部のキャプチャツールを使う方法がある

ニコ生の配信データを保存する rtmpdump のコマンド内容のまとめ

2番目の場合は NCV のフォルダ内にある plugins フォルダに NCVRTMPDumpWrapper.dll をコピーして NCV を起動。上のプラグイン(P)に NCVRTMPDumpWrapper が表示されるのでそれを選択して、出力先を外部アプリを選択。すると生放送が VLC で再生され、下のログ部分の

rtmpdump.exe -vr "rtmp://... 略 -m 10 -o -

までをコピーして、ニコ生でミラー配信するなら放送枠をとる。他のサイトならそれぞれ配信先の rtmp 部分を後ろにパイプしてつなげる。注意点はファイル配信と同様に -re をつけること、これを付け忘れると配信が止まる可能性がある。

  • 例 ニコ生にミラー
    rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -re -f flv -i - -codec copy -f flv rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777
  • 例 Ustreamにミラー
    rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -re -f flv -i - -codec copy -f flv "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"
  • 公式生放送はビットレートやfpsが大きく、そのままではニコ生でミラーできないのでリサイズしたり、fpsを少なくして再エンコードする。普段fpsや解像度はavsで記述するがライブストリームはavsで読み込めないのでffmpeg側で調整する。-r がfps、-s が解像度。

    rtmpdump.exe -vr "rtmp://... 略 -m 10 -o - | ffmpeg -re -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://...

  • rtmpdump の出力を ffmpeg で UDP に配信して、ユーザー生放送を2番組ミラーすることも可能である。ただしこの方法で配信すると片方の配信が止まると、配信それ自体も止まる。そしてそれぞれの解像度が異なる場合は映像を合わせるときに解像度を揃える必要がある。また UDP 配信では2入力できないのでこの下の 複数サイト同時配信(配信と録画) はできない。

    サイドの黒枠の余白を付けて 16:9 アスペクト比に変更しリサイズする例
    -vf "pad=max(iw,ih*(16/9)):ow/(16/9):(ow-iw)/2:(oh-ih)/2,scale=-1:240"

    • 上映像を rtmpdump で取り込み UDP に配信
      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 で取り込み UDP に配信
      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"

    3番目の場合で rtmpudmp の -N を使わない放送は ffmpeg でも映像を取り込むことができる。コマンドは2番目と同じように取得する。

    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://...

    4番目の場合は、SCFF でニコ生の放送画面(Flash)を取り込んで(取り込めない場合はブラウザを変えてみる)映像部分だけをトリミングすることで正確に映像部分だけをミラーすることができ、コメントも表示できる。この設定は左に映像、右にコメント欄が表示されている放送画面を想定している。

    • 運営コメントを含む
      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"

    複数サイト同時配信(配信と録画)


    新しい方法 その1


    フォーマットの tee を使えば複数サイト同時配信や、同時ファイル保存もできる。

    input.flv からニコ生と twitch に配信し output.flv で保存する例
    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=flv]rtmp://twitch|E:\output.flv"

    【ffmpeg】-f tee でマルチ配信の可能性について

    新しい方法 その2


    ffmpeg の複数サイトへの配信や配信しながらの録画には標準出力したのを標準入力してコピーする方法をとっていたが、別の方法として nginx を使い一度ローカルに配信したのを送信するか、再度 ffmpeg で取り込むことで同時に複数の配信や録画ができる。従来の標準出力・標準入力との違いは配信を中断することなく配信先の追加や変更ができるところである。

    従来の方法と違うのは同じ映像を複数出力できる点でビットレートや出力解像度を変更する場合は下の従来の方法をとる必要がある。

    以下のサイトを参考に話を進める
    NginxでRTMP同時配信 - pullover

    まず最初に rtmp 配信できる nginx をダウンロードしてくる。
    nginx for Windows 随時最新版に更新されている。
    下にある Product and Support Files から nginx をダウンロードする。

    nginx はコマンドプロンプトから実行するので起動と停止もそれで行う。
    • 起動コマンド:nginx
      起動はコマンドプロンプトからでなくても nginx.exe を実行するだけで起動できる。
    • 停止コマンド:nginx -s stop
      2回以上 nginx.exe を実行した場合などはタスクマネージャーから強制終了する。
    • 配信設定を変える:nginx -s reload
      以下にある nginx.conf の設定を nginx を切断することなく切り替える。放送のリレー配信などで効果的。しかし、ニコ生への配信はうまくいかない。

    nginx を解凍したフォルダの中の conf フォルダの中にある nginx.conf を以下のように書き換えて rtmp サーバ仕様に変更する。正しく書けていないと nginx が起動できないので、全角文字がないか、; を付け忘れていないか確認する。
    # から始まる行はコメント行として無視される。

    #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 の設定ではローカルへの配信先が rtmp://localhost/multi に代わり、ffmpeg の受信も同様に rtmp://localhost/multi になり、それをコピーしてニコ生に送信する。

    コマンド例(ローカル配信)ここのコマンドをテキストエディタにコピペして拡張子 .bat で保存する。
    普段設定している FFML の下に表示されているコマンドをコピペする。
    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://(以下略

    FFML での配信の場合はローカル配信のコマンドバッチを作ってニコ生への配信に FFML にする。現状の FFML は自動では localhost を入力できないので手動設定に変更して配信開始する。

    コマンドサンプル
    "H:FFML_v0.0.1.15.7.For.NET4.5ffmpeg.exe" -i rtmp://localhost/multi -c copy -f flv ${RTMPTONICO}

    その他の方法として外部サービスを利用する。この方法は同じ配信内容を複数のサイトに配信できる。アップロード1つに対して複数のサイトに配信でき、ネットワーク帯域が足りないときにも使える。

    Restream is a better way to stream on Youtube, Twitch, Ustream, Dailymotion and many other platforms at the same time.

    従来の方法


    ニコ生と他のサイトと同じ設定で同時配信は上の 新しい方法 を使う。この従来の方法では違うエンコード設定でも配信ができる。

    例 ニコ生と Ustream の同時配信。ビットレートを使い分ける

    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)"

    追記 2012年6月24日
    ffmpeg のパイプを使うことでマルチストリームができる。
    avsファイル入力で配信するとパイプ先の音声が途切れ途切れになるので実用に向かなかった。しかし -f dshow だと音声が途切れ途切れにならなかった。

    パイプを使うと同じエンコード設定をパイプ先でコピーするので負荷は1倍で複数サイトに配信、または配信映像の保存ができ、3つ以上の出力も可能。ただし一度出力したのをパイプするのでラグが単体配信よりも大きくなるが、この方法だと同時配信同士のラグはなくなる。

    またエンコードする ffmpeg と配信する ffmpeg は別にしたほうがいいかもしれない(未確認)。

    追記 2013年11月3日
    パイプして ffmpeg を使う場合にはパイプ先に入力と同じフレームレートを明示的に指定しないと音ズレ可能性がある。

    Twitter / mimumun: 表現が正確じゃなかったことを訂正します。ファイル保存用にpipe:して|して起動させた後のffmpegは再度-rでフレームレートを指定しないと-codec copyだけではフレームレートが設定されないっぽい

    ニコ生に配信しながら保存する方法
    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 -re -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

    ニコ生と Ustream に同時配信する方法
    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 -re -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)"

    TCPRelay を併用する場合。ポート番号を使い分けることで複数サイト同時配信ができる。
    TCPRelay で Ustream の Listen Port を 1934 に変更し ffmpeg の出力先のポート番号も変更する。エンコード設定は出力先ごとに指定する。
    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)"

    参照リンク

    配信内容をプレビューする


    tee を使うことで複数同時出力ができるので出力先を配信先、プレビュー用に2出力する。出力数に制限はないので同時に保存もできる。詳しくは 【ffmpeg】-f tee でマルチ配信の可能性について を参照。

    tee を使うので map と global_header をつけて、vsync, frame_drop_threshold もつけてドロップエラーの表示をなくす。

    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"

    udp://localhost:8080 を開くことで MPC や VLC、ffplay など UDP プロトコルに対応したプレイヤーでプレビューすることができる。

    ディレイ(遅延)配信をする


    一時ファイルを出力して再度それを読み込むことでディレイ配信ができる。読み込むと最初から読み込めるので、適宜ディレイ分だけ待ってから配信すればその分だけディレイする。一時出力するので配信と保存が同時にできる。

    一時ファイルを出力
    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://...

    TCPRelayの使い方


    このツールは主にUstreamや Twitch でFMLE以外で配信した場合に配信ビットレートが制限されるのを回避するツールです。元から配信ビットレート制限のあるニコ生のユーザー生放送での配信の場合には必要ない。0.2 以降のバージョンから Java が不要になっている。

    DL先:StrikerX3's Adventures: TCPRelay 0.4 beta 3

    • 0.1.1 beta の場合
      Javaがちゃんとインストールできているかコマンドプロンプトから java -version を実行して、アーカイブのreadmeにあるようにjava versionとJava(TM) SE Runtime Environment、32bitOSならJava HotSpot(TM) Client VM、64bitOSならJava HotSpot(TM) 64-Bit Server VMが表示されるのを確認。
      02-03-2012 15.37.56
    • 0.2 beta 以降の場合
      tcprelay_0223.png

      配信コマンドは 0.1.1 beta の場合と同じ

    • Ustreamの場合
      123456の部分は rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/ の123456と同じである

      rtmpのhostをlocalhostに書き換える

      普通に配信する場合
      "rtmp://1.123456.fme.ustream.tv/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"

      プロキシーを使ってlocalhost経由で配信する場合
      "rtmp://localhost/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"

      最終的にffmpegでは以下のように書く

      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/ustreamVideo/123456/abcdefghijklmnopqrstuvwxyzoffair flashver=FME/3.020(compatible;20FMSc/1.0)"

    • ニコ生の場合は配信先(nlpoca**の**部分)が放送番号によって変わるので毎回変更する。

      rtmpの接続先をlocalhostに書き換える

      普通に配信する場合
      rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777

      プロキシーを使ってlocalhost経由で配信する場合
      rtmp://localhost/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777

      最終的にffmpegではこのように書く
      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

      そして放送ページを開いて ffmpeg を実行して放送開始ボタンを押す。

    ニコ生の場合音声だけ配信やビットレートをあまり使わない映像付きの配信の場合はこの方法を取らなくても処理落ちせずにたぶん放送できると思うが、海外の配信サイトや高ビットレートで配信する場合は tcprelay で経由しないと処理落ちをして映像がカクカクになったり音声が乱れることがある。

    YUV4:2:2で配信


    YUV4:2:2(以下コロンは略)配信とはオリジナルの映像が RGB, YUV444 や YUV422 に対応した HDMIキャプチャや USBキャプチャ、ウェブカメラ等の映像の色(特に赤色)を今までの YUV420 よりも劣化させず配信することである。YUV422配信はビットレートを多く消費するためエンコード後の容量は大きくなる。Ustreram などで配信できるが、ニコ生では配信を開始して5秒ほどでエラーになり配信を継続できない。ニコ生の場合にYUV422の配信時に映像と音声が載るがタイムシフトでは映像と音声共に残らない。YUV422の動画のファイルをコピーしての配信では10秒エラーはないが、これもタイムシフトでは映像と音声共に残らない。

    ブラウザ(Flash Player)で再生される動画では 422P, 420P ともに映像の差は少ないが、PC上での再生では映像の再現に差が生じる点と、基本的には静止画ではなく動画の場合は 422P の方が容量が大きくなる。

    ffmpegの -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 を必ず指定する

    Avisynth で読み込む場合は avsファイルの映像取り込みの後ろに

    .ConvertToYUY2(matrix="rec709")

    をつなげる。YUV420 のときはこれを外し、色がどの程度違うかを比較する。avs と ffmpeg のコードは以下のとおり

    ImageSource("img.png", 0, 200, 20).ConvertToYUV2(matrix="rec709")
    ffmpeg -i "img.avs" -x264-params "colormatrix=bt709" -vcodec libx264 -crf 1 output.flv


    crf=0 にすると可逆圧縮(可逆圧縮形式にする場合は qp=0 が正解です:訂正 2013年5月26日)のYUV444になるのでcrf=1に設定した。SSはFlavieで撮った。XSplit_420は【XSplit】 どの仮想キャプチャで取り込んでも色は一緒になる より
    ffmpeg_ (4)

    original_imgimg_420img_422XSplit_420
    16.16.180255.0.018.14.180252.0.315.15.179255.0.015.16.178252.0.0
    180.16.160.255.0179.15.183.253.5180.16.150.255.1178.17.140.254.0
    180.16.1800.0.155181.15.1803.0.252179.16.1780.0.254179.16.1780.1.252
    16.180.16255.255.018.178.20255.253.915.179.16254.255.014.180.15254.254.0
    16.180.180255.0.25521.177.181255.0.25516.180.179255.0.25314.180.178252.0.253
    180.180.160.255.255182.178.228.252.255180.179.150.254.255178.18.130.254.252
    180.180.1800.0.0184.179.1750.0.0180.180.1800.0.0178.181.1780.1.0
    255.255.255255.253.255254.254.254253.255.252

    dshow 読み込みで422配信をする場合は -pix_fmt と colormatrix を指定する。

    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://...

    追記 2012年9月7日
    当初「YUV422配信はビットレートを多く消費するためエンコード後の容量は大きくなる」と書いていたが、実際に静止画で試すと逆に容量が小さくなった。エンコーダーはlibx264 2208

    素材
    420のSS 25,144 byte
    422のSS 19,609 byte

    コマンドは以下
    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

    参照リンク

    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 深度の有効性について


    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 が上がっている謎現象。と言うように解釈していました。


    設定の見方は 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倍程度大きい。


    エンコードのログ出力の方法


    • > hoge.txt 2>&1
      配信時のログがリダイレクトされてhoge.txtに出力される。この場合コンソールにはログが表示されない。
      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

    • コンソールにコマンドが流れて且つテキスト出力する方法
      • -vstats
        エンコードの状態だけ、最後の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
      エンコードのCPU負荷とメモリ消費量を数値化。値が大きいほど高負荷
      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://... 略

    参照リンク

    メタデータの追加方法


    メタデータを追加することで 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)


    例 ここまで

    参照リンク


    ロゴ追加は映像の任意の場所にロゴ(画像)を配置できる。

    参照リンク

    サブタイトル


    サブタイトルは映像の任意の場所に文字を挿入することができる。

    参照リンク

    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='%{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
    • 現在のフレーム番号を表示
      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 映像フレーム内でテキストが描画される場所の位置で出力画像の左上隅からの相対位置

    参照リンク

    オーバーレイ


    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

    参照リンク

    スタック(映像を並べる)


    2つ以上の映像を入力し、縦または横に配置する。今までは pad で余白を作って overlay で位置を指定して複数の映像を並べていたが、stack を使いことで文字数の少ないフィルターチェーンでより高速に処理が行える。注意点は 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:imgtest.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:t"

    修正 2014年8月11日
    コメント番号 739 より

    x:y はぼかす位置の左上隅の座標。横:縦
    w:h はぼかす範囲の解像度。横:縦
    t はぼかし具合の強さ。デフォルトは 4 で 0 1 に近いほど強くぼかす

    左上隅の座標は0:0です

    使い方例
    ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "delogo=362:230:98:30:1" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv

    XSplit のロゴを消す場合の指定例
    -vf "delogo=366:234:92:25:1" / 512x288 の解像度
    -vf "delogo=366:319:92:25:1" / 512x384 の解像度
    -vf "delogo=460:290:114:32:1" / 640x360 の解像度
    -vf "delogo=460:398:114:32:1" / 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_512x384.jpg


    配信映像が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 libvo_aacenc -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 にする方法は

    512x384-512x288.png


    -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


    2013年7月以降の設定

    一定周期の重複フレームを除外する。主な用途はデテレシネで 24fps化が規定値の設定でできる。

    • cycle
      この周期で除外するフレームを決める。規定値は 5
      つまり 5フレーム毎に重複フレームが有る場合は規定値の 5で良い。
    • dupthresh
      除外を決める閾値の設定。1 に近づけるほど正確に処理をする。規定値で重複フレームが有る場合は値を下げるが、値を上げても特に早くならないので規定値のままで良い。規定値は 1.1
    • scthresh
      シーンチェンジの閾値の設定。値を小さくするほど不正確になる。規定値は 15
    • blockx, blocky
      横幅xと縦幅yのサイズのブロックで重複フレームの除外の計算をする。値が大きいほど不正確になる。解像度の約数に合わせる。規定値は 32
    • ppsrc
      1入力目のファイルに映像効果のフィルタを使わずに、2入力目のファイルに映像効果のあるフィルタを使う。
      1入力目のファイルで重複フレームを調べて、2入力目のファイルに重複フレームを除外して出力する。規定値は 0
      フィルタ内でリサイズするとうまく処理できないので -s でリサイズする。結果、オリジナルの解像度で重複フレームを検出するので低速になる。

      ffmpeg -i infile -filter_complex "[0:0]unsharp[v1];[v1][0:0]decimate=ppsrc=1" outfile
    • chroma
      彩度を考慮するかどうか。規定値は 1

    規定値の例
    -filter_complex decimate=cycle=5:dupthresh=1.1:scthresh=15:blockx=64:blocky=64:chroma=1

    参照リンク
    FFmpeg documentation : : decimate

    昔の設定

    昔書いていた decimate は、mpdecimate に変わった。動きがなくなれば Drop して出力フレームが 0 になり、動きがあれば動きに合わせて入力フレームレートの範囲内で出力する。初見ゲーム放送など、映像が動いたり止まったりする放送にはこの設定が効果的で、CPU負荷も Drop している間は低下し容量も小さくなる。可変フレームレートの動画になるので、この設定で出力された動画を切ったりつなげたりするのには向かない。また動画に映像と音声がある場合に音声をコピーして映像を mpdecimate をかけてエンコードした場合にはフィルタがうまく機能しない。

    入力デバイスを -r でフレームレートを指定した場合にはその値が最大フレームレートになる。

    フィルタの指定例
    -vf mpdecimate=max:hi:lo:frac
    -vf mpdecimate=0:768:320:0.33

    • max は連続したフレームの Drop できる値。規定値は 0
      プラスの場合は最大値、マイナスの場合は最小値。0 を指定すると考慮されない。
    • hi は映像がどれだけ違うと Drop するかの上限の設定。規定値は 64*12 つまり 768
      8x8 pixel を1単位とする。
    • lo は映像がどれだけ違うと Drop するかの下限の設定。規定値は 64*5 つまり 320
      8x8 pixel を1単位とする。
    • frac は1フレームの画像のどれだけの範囲を参照するかの設定。規定値は 0.33
      1 は全画面。

    ffmpeg の出力例
    ffmpeg -i input -vf mpdecimate output

    参照リンク

    スプリット


    入力した映像をコピーしフィルタの適応を比較する場合などに使う。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」をコピペする。
    ffml_split.png

    参照リンク


    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

    参照リンク

    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 及び総評

    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 を使う。


    -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
      上げると暗く締まった感じに、下げると明るくぼやけた感じに
    • brightness
      輝度:-1.0 から 1.0 までの float、規定値は 0
      上げると明るく、下げると暗くなる。YUV だと Y にだけ影響がある。
    • saturation
      彩度:0.0 から 3.0 までの float、規定値は 1
      上げるとはっきりとした色に、下げるとモノクロに近づく
    • 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(明暗調整)(旧仕様)


    映像全体を明るくしたり暗くしたり、はっきりした色に調整する。実際の明度調整は下のカラーバランスフィルタを推奨。vf 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) データを任意に調整できるフィルタ。上の eq よりも直感的に設定できる。eq は平均的に上げ下げできるのに対して、lut は val を使うことで元の数値が大きいほど効果が強くなる。入力するデータによってフィルタ名を変えて使う。YUV なら lutyuv, RGB なら lutrgb。

    規定値の輝度を1.2倍上げて明るくする
    -vf lutyuv=y=1.2*val

    • r
      RGB の R を指定
    • g
      RGB の G を指定
    • b
      RGB の B を指定
    • a
      アルファチャンネルを指定
    • y
      YUV の Y(輝度)を指定
    • u
      YUV の U/Cb(青)を指定
    • v
      YUV の V/Cr(赤)を指定

    使える書式

    • w
      入力した映像の横幅
    • h
      入力した映像の縦幅
    • val
      入力した映像の値
    • clip
    • maxval
      入力した映像の最大値
    • minval
      入力した映像の最小値
    • negval
      入力した映像の反転値
    • clip(val, minval, maxval)
      minval から maxval までのレンジを返す。int を代入するとレンジを狭めたりできる
    • 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】動画・音声を連結する concat の使い方【ffmpeg】動画・音声を連結する concat の使い方 其の2 を参照。

    pad


    入力ソースに余白を作る。オーバーレイするときに解像度を拡張するときに使われる。


    -vf "pad=width:height:x:y:color"

    width:height は余白を含めた出力解像度。横:縦
    x:y は左上隅を0:0として余白部分の解像度。横:縦

    width - x = 入力ソースの横の解像度になる
    height - y = 入力ソースの縦の解像度になる

    color は余白の色。既定値は黒(black)。指定方法は色の名前指定かRRGGBB形式が使える。


    • 上に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
      取り込む音声の数。規定値は2
    • duration
      複数の音声を再生時間が異なる場合にどちらの時間を優先するかのオプション
      • longest
        長い方。規定値
      • shortest
        短い方
      • first
        最初に入力した方
    • dropout_transition
      音声のエンコードが終わって他が続いている場合にその終わり方にフェードアウトする時間。規定値は2(秒)

    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 がある。こちらも音声を合成するが、合成すると合成した分だけマルチトラックになる。

    参照リンク

    サンプリング周波数の調整


    インプットした音声のサンプリング周波数を調整する。

    例 インプットした音声を44.1kHzに調整する
    aresample=44100

    ffmpeg の使用例
    ffmpeg -f lavfi -i "amovie=audio,aresample=44100" -acodec 以下略
    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"

    参照リンク
    FFmpeg documentation : : 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
      急に音量が上がったときに何秒以上の時にフィルタを掛けるか。チャンネル数が増える毎に指定できる数も増える
      規定値:0.3(秒)
    • decays
      急に音量が下がったときに何秒以上の時にフィルタを掛けるか。チャンネル数が増える毎に指定できる数も増える
      規定値:0.8(秒)
    • points
      / の左が入力、右が出力のデシベル指定で音量を変更する。小さい値から複数当てることでなだらかに音量を変更できる。入力を出力の値に確実に近づけるには soft-knee の値を大きくする
      指定可能な範囲:-900 ~ 0
    • soft-knee
      音量変更のカーブを指定する。大きい値ほど dB の変化が大きい
      指定可能な範囲:0.01 ~ 900
      規定値:0.01(dB)
    • gain
      points で指定したデシベルの値のすべてに指定値だけ値を増やす
      規定値:0(dB)
    • volume
      音量の初期値の指定。gain で大きすぎる値を指定してもうまく機能しないときに volume で初期値を変更する
      指定可能な範囲:-900 ~ 0
      規定値:0(dB)
    • delay
      compand フィルタを掛けるのにどれだけバッファを持たせるか。attack か decay と同じ値にすることで compand が効果的に掛かる
      規定値:0(秒)

    配信用途での基本設定は attacks, decays, delay を 0.1 に指定し、points でどの音量を上げ下げするかを指定する。ただし points で大きい音量を小さくするとダイナミックレンジが狭まるので gain で全体を下げた方が印象が良い。

    -af "compand=.1 .1:.1 .1:-60/-100 -40/-40:1:0:0:.1"

    問題は points をどのような値にすれば良いかだが、最初に自分の配信がどの程度のデシベルなのかを知る必要がある。

    この中から適当なのを選んで調べてみる。
    水おいしいです^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」を指定する。音が多重に聞こえる場合はこのデバイスで聴くにチェックを入れない。

    WaveSpectra_rec_device.png

    波形を表示するには赤丸の録音ボタンを押すと波形が表示される。
    特定の帯域を調べるには 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 の後ろにフィルタを追加する。

    ffmpeg_compand_ffml_01.png

    外部入力のゲーム音や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"

    ffmpeg_compand_ffml_02.png

    映像フィルタを指定する場合は 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"

    参照リンク


    ピッチ変更


    音声のピッチを任意の周波数に変更して音程を高くしたり低くしたりする。

    基本コマンド
    -af asetrate=44100

    入力した音声のサンプリング周波数より高ければ高音に、低ければ低音に変えて出力する。出力周波数は変更した周波数に変わるのでニコ生用途では -ar 44100 を追加するか、sox をインストールしていれば -af aresample=44100:resampler=soxr でリサンプルして元に戻す。

    参照リンク
    FFmpeg Filters Documentation :: asetrate

    binaural(バイノーラル)


    バイノーラルフィルタ。スピーカー以外の環境でスピーカーのように前方から音が聞こえるようにするフィルタ。zeranoe は対応しているがライブラリを別途インストールする必要があるのでビルドスクリプトが対応していないと導入が難しい。

    コメント773 より、正しい解釈はコメントの通りで Wikipedia にもあるように「人間の頭部の音響効果を再現するダミー・ヘッドやシミュレータなどを利用して、鼓膜に届く状態で音を記録することで、ステレオ・ヘッドフォンやステレオ・イヤフォン等で聴取すると、あたかもその場に居合わせたかのような臨場感を再現」です。つまり一般的な視聴環境である スピーカーなどイヤフォンやヘッドフォン以外の環境では違和感があるかもしれません。

    必要ライブラリは libsndfile と 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 フィルタよりも手軽に立体音響っぽくするフィルタ。ネイティブフィルタなので別途ライブラリをインストールする必要が無い。最新git で使える。

    基本コマンド
    -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"

    • 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>"


    注意点


    テストの過程でわかったことの列記
    • 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 libvo_aacenc -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?

    その他の参照リンク



    ameroad.netで先行配信で購読してくれた2名の方ありがとうございました。無事に2012年3月5日の夜の公開に間に合いました。
    Windowsのffmpegで生放送する方法 - Ameroad_1330947370145
    関連記事

この記事へのコメント

金の髭2012/09/03 (月) 01:15:49

注意点のcolormatrix関係についていくつかコメントをば。

●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 (月) 02:03:43

追記:
●「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 (月) 23:22:16

金の髭 さん指摘ありがとうございます。

「YUV4:2:2で配信」のところは訂正しました。
-vf colormatrix=bt601:smpte240m と -x264opts "colormatrix=smpte170m" の違いについてはもう少し調べてみます。

少佐2012/11/01 (木) 18:36:19

一部の項目の記述は省略しますが、x264形式で項目を指定する場合、
-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 (木) 19:12:15

追記:-x264opts の内部で指定する場合の方法
カンマ「,」区切りなら、2つ目の値も正しく反映されました。
-x264opts "8x8dct=1:deblock=0,0:psy-rd=0.5,0.0:qcomp=0.6"
のように書く感じになります。

ロベルト2012/11/01 (木) 21:05:12

少佐 さんこんばんは

指摘ありがとうございます。訂正しました。

少佐2013/04/07 (日) 00:17:25

2013/02/23 John Van Sickle git-2f325a6
「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 (日) 11:28:56

少佐 さんこんにちは

報告ありがとうございます。記事に反映しました。

少佐2014/08/11 (月) 00:14:04

デロゴフィルターについて
先日たまたまデロゴフィルターを設定してみる機会があったときに発見しました。
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 (月) 00:27:15

追記:
ちょっと履歴みたところ、以下のコミットのタイミングで修正されたようですね。
https://github.com/FFmpeg/FFmpeg/commit/4e10d87f384a11b11034349e441f76207275c756

すぺt2015/10/19 (月) 07:35:53

bs2bのところで立体音響化と書いてありますが実際にはどうも違うみたいです。
立体的にするのではなく、ヘッドホンなどで聞く場合の音の定位を前面に補正するというのがどうも正しい解釈のようです。
スピーカーで再生する場合はスピーカーの位置が人の前面にありますが、ヘッドホンだときっちり左右に音が分かれてしまうので、それをスピーカーで聞くときのように前面から聞いているような補正をする・・・というイメージではないかと思います。

ロベルト2015/10/20 (火) 23:02:02

すぺt さん指摘ありがとうございます。

記事に反映しました。

管理人のみ通知 :

トラックバック


ニコニコチャンネル始めました
ニコラボチャンネル
スポンサード リンク
THE IDOLM@STER THE@TER ACTIVITIES 03
THE IDOLM@STER THE@TER ACTIVITIES 03

Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン
妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン

Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita
Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita

【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))
【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))

「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)
「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)

TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」
TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」

『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤
『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤

本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」
本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」

新着記事と追記・編集記事
スポンサード リンク
ブログ内検索
プロフィール

Author:ロベルト
お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab
ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

カテゴリ
アクセスの多い記事
記事アーカイブ

最新コメント
リンク
ニコニコ静画
アニメカテゴリ毎時ランキング
免責事項
当ブログはリンクフリーです。記事によりトラブルが生じた場合でも、当ブログ管理人は一切の責任を負いません。 当ブログに記載されている情報の正誤や利用は、ご自身の判断でお願いします。 紹介したアプリケーションに関する問い合わせは作者に問い合わせてください。ニコニコ動画に関する質問はまずは公式掲示板、2ch、各Q&Aサイトを参照ください。
ブログの読者になる(RSS)
アクセス数