Windows の ffmpeg で生放送する方法

2018年現在、主流になっている新配信はこの方法で出来るが、エンコード設定は最適化されていない。

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

この記事は 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"


詳細は以下を参照。

追記 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、min-keyint=auto、profile 。なので direct-direct-pred のffmpegのオプションを使い、-x264-params min-keyintは実数を指定し、profile -vcodec libx264 -vprofile main などと指定する。


ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -pix_fmt yuv420p -vcodec libx264 -x264-params 8x8dct=1:aq-mode=2:bframes=1:deblock=0,0:direct=auto:ipratio=1.41:keyint=240:level=3.1: me=hex:merange=16:min-keyint=24:mixed-refs=1:no-mbtree=0:partitions=all:psy-rd=0.5,0.0:qcomp=0.6:qpmax=51:qpmin=10:qpstep=4:ratetol=10:rc-lookahead=30:ref=2:subme=7:scenecut=40:threads=0:trellis=2: weightb=1:weightp=2:colormatrix=smpte170m -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 80k -f flv rtmp://...

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
libfdk_aac
HE-AAClibfdk_aac
HE-AAC v2libfdk_aac
HE-AACは特別にffmpegを自分で作らないと使えない
作り方は HE-AAC が使える ffmpeg をつくる方法【ffmpeg】 fdk-aac をffmpeg に組み込む を参照

音声コーデックの基本オプションは共通
ただし nellymoser は-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で2倍の約+6dB
現在は廃止され代わりにvolumeフィルタを使う

音声コーデックとビットレートの目安
周波数(kHz)チャンネル数ビットレート(kb/s)
Speex1618~36
HE-AAC v222.05~44.1212~48
Nellymoser22.05136~48
MP322.05148~64
HE-AAC v144.1248~80
MP344.11 or 264~80
MP344.1280~320
AAC-LC44.12128~320

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 の場合
上限は fdk-aac(LC) は 530k まで、fdk-aac(HE) は 128k まで、fdk-aac(HEv2) は 64k まで。
下限は fdk-aac(LC) は 12k まで、fdk-aac(HE) は 16k まで、fdk-aac(HEv2) は 12k まで。

内蔵のAACは2021年5月21日以降twoloopがデフォルトで有効になった。レートコントロールで品質がよくなるため。
aacenc: make the twoloop coder the default · FFmpeg/FFmpeg@660d1d8

使い方例
-acodec libspeex -ac 1 -ar 16000 [-ab **k or -ap *]
-acodec nellymoser -ac 1 -ar [11025 or 22050 or 44100] -ab **k
-acodec libmp3lame -ar 44100 [-ab **k or -ap *]
-acodec aac -profile:a -ab **k -ar 44100 -aac_coder twoloop
-acodec libfdk_aac -profile:a [aac_low or aac_he or aac_he_v2] -ab **k -ar 44100


優先順位の変更


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


start /high ffmpeg ... 以下略

ffmpegのリサイズオプション


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

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

グラフは下に行くほどシャープになる。
オプション名メモ
accurate_rnd+bilinearぼんやり
bilinearぼんやり
experimentalややぼんやり
bicubicややシャープ
splineややシャープ
accurate_rnd+lanczosシャープ
lanczosシャープ

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

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


"scale=640:-1:flags=lanczos"

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


ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -sws_flags lanczos -s 512x288 -vcodec libx264 -crf 27 -maxrate 300k -bufsize 600k -x264-params "colormatrix=smpte170m" -acodec aac -ar 44100 -ab 80k -f flv rtmp://...

ちなみに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 aac -ar 44100 -ab 80k -f flv rtmp://...

参照リンク

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


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

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

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

他には遅延にも影響する。
[FFmpeg-user] High audio latency (although low with ffplay!)

複数の音声デバイスを 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 fifo -fifo_format flv -map 0:v -map 0:a -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 rtmp://nlpoca**.live.nicovideo.jp:1935/publicorigin/01?12345678:lv77777777:1:98765432:85216e7419dbfbed/lv77777777

fifo について
FFmpeg Formats Documentation : fifo

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 もオプションから変更できる。

設定可能な範囲は以下のコマンドで調べられる。
ffmpeg -list_options true -f dshow -i video="SCFF DirectShow Filter"
ffmpeg -list_options true -f dshow -i audio="ステレオ ミキサー (Realtek High Definit"

設定方法は -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)


仮想ステレオミキサーを指定する


【Windows7】 無料でステレオミキサーの機能を追加する を参照。

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になっているのが分かる。


参照リンク
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 aac -ar 44100 -ab 128k -f flv rtmp://...

映像デバイスと同様にavsで読み込んで映像をオフ(-vn)にする方法がある。
ffmpeg -i "ndc.avs" -x264-params "colormatrix=smpte170m" -vn -acodec aac -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. 外部のキャプチャツールを使う方法
  5. ニコ生対応の ffmpeg を使う方法がある

ニコ生の配信データを保存する 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 -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 -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 -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:onfail=ignore]rtmp://ニコ生|[f=flv:onfail=ignore]rtmp://twitch|E:\output.flv"

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

    新しい方法 その2


    nginx を使い一度ローカルに配信したのを送信する。

    以下のサイトを参考に話を進める
    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 -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 -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://...

    -itsoffsetを使ってエンコード開始を指定時間だけずらす方法もある。こちらはずらした時間だけエンコード開始も遅れるのでずらした時間のデータは出力されない。

    -itsoffsetに負の時間だけエンコード開始が遅れる。下の例はコマンドを実行して15秒経過したらエンコードを始める。
    ffmpeg -itsoffset -15 -rtbufsize 100MB -f dshow -i video="devise_name":audio="devise_name" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec aac -ar 44100 -ab 128k -f flv rtmp://...

    TCPRelayの使い方


    このツールは主に Youtube や Twitch, ニコ生の新配信を ffmpeg で配信した場合に配信ビットレートが 1Mbps のように高いと処理落ち(映像が途切れる)するのを回避するツールです。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 の場合と同じ

    • ニコ生の場合は配信先(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 深度の有効性について


    2018年以降の最新版では複数のビット深度に対応したのでビルドを使い分ける必要がなくなった。出力方法は出力フォーマットに -pix_fmt yuv420p10le を追加する。

    x264 のビルドのときに --bit-depth=10 を付けると標準で 10bit 深度になる。何も付けなければ 8bit 深度である。この x264 を使って ffmpeg をビルドするとこちらも標準で 10bit 深度になる。10bit 深度の映像は再生環境が限られるので、自己の動画保存目的以外には推奨されない。

    flash 10.3 バージョンだと右端に紫の枠が、11.7 バージョンだと全体が緑っぽくなる。Directshow ベースのデコーダーの場合 LAV Video Decoder は対応しているが、それ以外の備え付けのデコーダーの動画プレイヤは正常に再生できないことが多い。

    同様に生放送用途で使う場合でもフラッシュのバージョンで見え方が違うので非推奨である。ニコニコのタイムシフトや Twitc では配信通りにアーカイブ化される。

    10bit 深度のメリットは色の階調の表現力であるが、ビットレートが足りていない状況下であえてそれを使うメリットはあるかどうかは未確認。一般的には2割程度エンコード速度が遅くなり、各フレームの AQ QP はとても悪くなる大きくなり(大きくなったからといって画質は悪くなっていない)、容量あたりの ssim は良くなる。

    訂正 2013/05/26 0時
    AQ ではなく、各フレームの品質を表す QP です。
    たくあんさん 指摘ありがとうございます。

    訂正 2013/05/26 0時45分
    QP の値が 8bit のときと比べて大きくなるのは 10bit の QP の値の範囲が 8bit の時よりも広いので、QP の値が大きくなった=品質が悪くなったのに ssim が上がっている謎現象。と言うように解釈していました。


    設定の見方は ffmpeg(libx264) のエンコードログの見方 を参照。

    opengl を使って OBS や NLE で取り込む


    ffmpeg の出力先を opengl にすることで OBS や NLE、XSplit などで取り込むことができる。これの利点は ffmpeg で取り込んだ映像をフィルタを当てて別デバイスで取り込めるところである。当てるフィルタはリサイズフィルタや色調整フィルタ、unsharp フィルタなどである。欠点はデバイスで映像を取り込んだ時に 0.02 秒ほど遅延するので映像と音声のズレを気にしない場合はそのままで良いが、気にする場合は音声の読み込みを遅らせる必要がある。

    基本コマンド
    ffmpeg -rtbufsize 100MB -f dshow -i video="SCFF DirectShow Filter" -f opengl -

    映像の遅延分を音声に遅延を加えて読み込むコマンド
    ffmpeg -rtbufsize 100MB -f dshow -itsoffset 0.02 -i audio="XSplitBroadcaster" -f dshow -i video="XSplitBroadcaster" 以下略

    参照リンク

    ffmpeg で OpenGL の表示が可能に

    TSを保存せずに倍速再生で視聴する


    TS を保存せずに倍速再生する方法は2種類あり、NCV の NCVRTMPDumpWrapper で TS のコメントを取得してプラグインで出力先を外部アプリを起動して視聴する方法。もうひとつが配信中の番組または TS を外部配信サイトやアップローダーなどにミラーして録画データを VLC などで視聴する方法。

    プレイヤーで再生するときにコメントをオーバーレイして表示させるかぶせるコメントビューアが便利。

    参照リンク

    dshow 読み込みと avs 読み込みの違い


    dshow 読み込みは例えば FFMPEG Launcher を使って手軽に配信する方法。avs 読み込みはコマンドを書く作業があり配信環境を作るのに手間がかかる方法。

    • dshow 読み込みのメリットは配信方法が直感的にわかりやすい。
    • avs 読み込みのメリットはAvisynthのプラグインが使えることと、32bit ffmpeg の dshow で読めないデバイスが読み込める場合もあるが、その逆もあり一長一短。
    • avs 読み込みのデメリットはコマンドを書く作業に慣れる必要があることと、dshow 読み込みに比べて映像入力の場合はメモリ消費量が起動した時から増え始め、最終的に増大が止まる頃には4倍から5倍とかなり大きい。音声入力の場合はメモリ消費量は増大しないがそれでも3倍程度大きい。


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


    • -hide_banner
      表示されるconfigureオプションやライブラリのバージョンを非表示にする
      ffmpeg -hide_banner -i input output

    • > hoge.txt 2>&1
      配信時のログがリダイレクトされてhoge.txtに出力される。この場合コンソールにはログが表示されない。追記するなら >> hoge.txt 2>&1
      ffmpeg -i "ndc.avs" -x264-params "colormatrix=smpte170m" -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k -acodec libmp3lame -ar 44100 -ab 96k -f flv rtmp://... 略 > hoge.txt 2>&1

    • ログをコンソールに流さずにテキストで保存する。
      ffmpeg -report -i input -vf showinfo -an -f null - > nul 2>&1

      先にFFREPORTでファイル名とデバグレベルを指定するとログのファイル名が指定できる。
      set FFREPORT=file=showinfo.log:level=48

    • コンソールにコマンドが流れて且つテキスト出力する方法
      • -vstats
        エンコードの状態だけ、libx264では最後のIPBフレームの結果は表示されない
        映像のコーディング統計情報を‘vstats_HHMMSS.log’の形式で出力する
        ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -vstats

      • -vstats_file hoge.log
        映像のコーディング統計情報をhoge.logの場所に出力する
        ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -vstats_file hoge.log

      • -report
        最後のIPBフレームの結果も表示される。
        映像のコーディング統計情報を ffmpeg-yyyyMMdd-HHMMSS.log にダンプする
        ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -report

    • -tune ssim -ssim 1
      予めあるファイルをエンコードしてエンコード前と後の画質を比較するオプション
      訂正 2012年3月30日 配信時にも使えました。
      ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -tune ssim -ssim 1 -f flv rtmp://...

    • -nostats
      逆にエンコードの進捗ログを出さない方法
      ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -f flv rtmp://... 略 -nostats

    • -benchmark
      エンコードの処理時間とメモリ消費量を数値化。値が大きいほど高負荷
      ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -benchmark -f flv rtmp://... 略
      utime:user time、stime:system time、rtime:real time、maxrssの4つが表示される。
      Linux の time コマンドのカーネル内部動作と出力される時間の意味 - Qiita
      benchmarking - Understanding ffmpeg -benchmark results - Stack Overflow

    • -loglevel
      ログレベルを指定して表示するログの出力内容を変更する
      repeat:「Last message repeated n times」が複数表示されるのを省略する
      level:レベル指定。+-でそのログレベルの使用不使用を決める
      quiet, -8:なにも表示しない
      panic, 0:致命的なエラーだけ表示するが、現在は使われていない
      fatal, 8:致命的なエラーだけ表示する。このエラーが出るとプロセスは中断する
      error, 16:致命的ではない再開できるエラーも含めてすべてのエラーを表示する
      warning, 24:すべての警告とエラーを表示する
      info, 32:通常のエラーを表示する。既定値
      verbose, 40:infoと似ているがもう少し冗長
      debug, 48:デバグ情報を含めてすべてを表示する
      trace, 56
      ffmpeg -loglevel repeat+level+verbose -i input output

    • set FFREPORT=file=ffreport.txt:level=32
      fileで出力ログ名を指定しlevelでログレベルを指定すると、そのセッションの間は指定したログに指定したログレベルで上書きする。別のコマンドを別のログファイルで出力するには再度set FFREPORTを実行する
      set FFREPORT=file=ffreport.log:level=32
      ffmpeg -i input output

    • -stats_period 1 -progress foo.txt
      -stats_periodの指定秒間隔でエンコードの経過のログファイルを-progressで指定した場所に出力する。以下の例は60秒ごとにfoo.txtに追記出力する。ネットワーク越しにも出力できるのでログ監視にも使える。-stats_periodだけだと既定値は0.5でになり、0.5秒間隔でログがコマンドプロンプトに流れる
      ffmpeg -stats_period 60 -progress foo.txt -i input output

      出力例
      frame=375
      fps=24.96
      stream_0_0_q=-1.0
      bitrate= 6.7kbits/s
      total_size=12423
      out_time_us=14880078
      out_time_ms=14880078
      out_time=00:00:14.880078
      dup_frames=0
      drop_frames=0
      speed=0.99x
      progress=end

    参照リンク

    メタデータの追加方法


    メタデータを追加することで 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='%{gmtime}'
    • YYYY-MM-DD HH:MM:SS 形式で日時と時間の表示
      text='%{localtime}'
    • hh:mm:ss 形式で時間の表示
      text='%{localtime\:%X}'
      そのほかの指定方法は PHP: strftime - Manual を参照。
      使えなかったのはこちら r, T, D, F, s, R, P, l, I, k, G, C, h, V, u, e
    • 現在のフレーム番号を表示(0スタート)
      text='%{n}'
      text='%{frame_num}'
    • 現在のタイムスタンプを表示
      • マイクロ秒で表示。既定値
        text='%{pts\:flt}'
      • HH:MM:SS.mmm 形式で表示
        text='%{pts\:hms}'


    ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)" -vf drawtext="fontfile='C\://Windows/Fonts/msgothic.ttc':text='Text to write':fontsize=20:x=100:y=100:fontcolor=red:bordercolor=yellow" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 26 -keyint_min 0 -maxrate 300k -bufsize 600k hoge.flv

    come.txt をリアルタイムで表示しながら上部真ん中にテキストを表示
    ffplay -f lavfi -i color=c=black:r=24 -vf drawtext=fontfile="'C\://Windows/Fonts/msgothic.ttc':fontcolor=black: textfile='come.txt':fontsize=24:x=(w-tw)/2:reload=1: borderw=2:bordercolor=white@0.5"

    現在の時刻を左上に表示
    ffplay -f lavfi -i color=c=white:r=24,drawtext=fontfile="'C\://Windows/Fonts/msgothic.ttc':text='%{localtime}'"

    • text と textfile が両方指定されている場合はエラー
    • textfile は改行コメントができるが text の改行コメントの仕方がわからない
    • boxcolor は box と併用する
    • shadowx,shadowy は shadowcolor と併用する
    • borderw は bordercolor と併用する
    • x, y 映像フレーム内でテキストが描画される場所の位置で出力画像の左上隅からの相対位置

    参照リンク

    オーバーレイ


    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 フィルタで余白に置いて複数の映像を並べていたが、 hstack, vstack フィルタを使えば文字数少なく処理がはやくなる。注意点は vstack なら横幅、 hstack なら縦幅が同じで、映像フォーマットも同じであること。

    縦に並べる。1入力が一番上で順番に下につながる
    -vf split,vstack

    横に並べる。1入力が左で順番に右につながる
    -vf split,hstack

    3毎、つなげる場合
    -vf split=3,vstack=3

    識別子をつける場合
    -vf split[a][b],[a][b]vstack

    参照リンク
    FFmpeg Filters Documentation :: hstack
    FFmpeg Filters Documentation :: vstack

    movie


    透過pngを含む画像や動画をフィルタ内に取り込む。音声は amovieフィルタを使う。またインターネット上のソースも可能。特殊文字のエスケープに注意。

    例えばテストソースにニコニコ大百科のロゴを右下に配置する方法
    http://dic.nicovideo.jp/img/logo_nicopedia.gif

    ffplay -f lavfi -i testsrc -vf "movie='http\://dic.nicovideo.jp/img/logo_nicopedia.gif' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"

    例:C:\img\test.png を指定する場合


    絶対パスで指定する方法
    -vf "movie='C\:/img/test.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"

    相対パスで指定する方法
    ffmpeg のフォルダ内のimgフォルダ内にある img.png を指定する
    -vf "movie='img/img.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"

    ffmpeg のオーバーレイを使った出力例
    ffmpeg -rtbufsize 100MB -f dshow -i video="NDC(XP)":audio="AmaRec Core Audio Capture" -vf "movie='C\:/img/test.png' [logo]; [in][logo] overlay=W-w-10:H-h-10 [out]"-x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv

    特定の時間から読み込むこともできる。以下の例は 開始10秒から読み込む。
    ffplay -f lavfi -i "movie=video.mp4:sp=10,setpts=PTS-STARTPTS"

    読み込み終了時間を指定する場合は trim フィルタの duration を併用する。
    以下の例は開始10秒から10秒間読み込む。
    ffplay -f lavfi -i "movie=video.mp4:sp=10,trim=duration=10,setpts=PTS-STARTPTS"

    参照リンク


    デロゴフィルターだが効果はロゴデータを用いてロゴを消すのではなくて、指定範囲をぼかす(周りの色を参考にブレンドする)フィルター。弱点としてぼかす範囲内に明暗差が激しい映像だときれいにぼかせない。


    -vf "delogo=x:y:w:h:show"

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

    x:y はぼかす位置の左上隅の座標。横:縦
    w:h はぼかす範囲の解像度。横:縦
    t オプションは2021年の1月に廃止された
    show[boolean] フィルタが当たる部分の外枠1ピクセルを緑色で描写する。別途外枠にピクセルを描写するのでshowの設定の有無にかかわらずx=0:y=0などの隅に使えず1ピクセル以上隅から離す。

    doc/filters: remove option band in delogo FFmpeg/FFmpeg@c5341d4 GitHub

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

    XSplit のロゴを消す場合の指定例
    -vf "delogo=366:234:92:25" / 512x288 の解像度
    -vf "delogo=366:319:92:25" / 512x384 の解像度
    -vf "delogo=460:290:114:32" / 640x360 の解像度
    -vf "delogo=460:398:114:32" / 640x480 の解像度

    参照リンク
    FFmpeg documentation : : delogo


    こちらがロゴデータを元にロゴを消す(周りの色を参考に転写する)フィルター。ただしこちらもロゴデータの下に明暗差が激しい映像だときれいにぼかせない。また配布しているffmpegによってはこのフィルターが使えないかもしれない。

    追記 2013/08/31


    -vf removelogo=f=logo.bmp

    実行するffmpegと同じフォルダ内にロゴデータを置いてffmpegを実行する。

    ロゴデータは背景を真っ黒にロゴだけを表示してスクリーンショットをとって.bmp形式で保存する。
    ロゴデータの解像度と元の映像の解像度は一致しなければならない。

    XSplit のロゴを消す場合の指定例
    ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf removelogo=f=logo.bmp -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv

    XSplit 用のロゴデータはこちらにアップしています。
    Dropbox - removelogo_XSplit.zip

    参照リンク
    FFmpeg documentation : : removelogo

    removelogo の利用例:ffmpeg できれいにロゴを消す方法

    以下は旧仕様


    -vf "mp=remove-logo:logo.ppm"

    実行するffmpegと同じフォルダ内にロゴデータを置いてffmpegを実行する。

    ロゴデータは背景を真っ黒にロゴだけを表示してスクリーンショットをとって.ppm形式に変換する。画像変換には IrfanView を使う。画像を開いて ファイル < 名前を付けて保存 < ファイル形式 PPM 圧縮なし バイナリデータとして符号化 で保存する。

    XSplit のロゴを消す場合の指定例
    ffmpeg -rtbufsize 100MB -f dshow -i video="XSplitBroadcaster":audio="XSplitBroadcaster" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "mp=remove-logo:512x288.ppm" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -y output.flv

    XSplit 用のロゴデータはこちらにアップしています。
    removelogo_data.zip - Solidfiles

    XSplit のロゴデータをきれいに消す裏ワザがあり、16:9の解像度の映像なら横幅を固定して4:3の解像度で配信して、映像を上に移動させておけばロゴを消す背景部分が真っ黒になりロゴだけきれいに消える。この場合コメントを下に流すコマンド /commentmode shita を使うと見栄えが良くなる。

    512x288_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 aac -ar 44100 -ab 80k hoge.flv

    参照リンク

    Zスケール


    外部ライブラリを使って新しいリサイズ方法を追加する。


    -vf zscale=640:-1:f=spline16

    詳しくは:Zライブラリを使ったリサイズフィルタ zscale

    クロップ


    入力映像をクロップ(切り出)して出力映像の解像度を小さくする。


    -vf "crop=x:y:w:h"

    x:y は出力解像度。横:縦
    w:h は出力解像度の左上隅の座標。横:縦

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

    入力映像の解像度が 512x384 のときクロップして上の青い部分を残して 512x288 にする方法は

    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


    フレームを間引くdecimate、mpdecimateに内容を引っ越した。

    スプリット


    入力した映像をコピーしフィルタの適応を比較する場合などに使う。ffplay でフィルタの比較をするのに便利。既定値は 2。


    -vf split=2

    左はそのまま、右に unsharp フィルタを適応し ffmpeg でエンコード
    ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w -pix_fmt yuv420p -vcodec libx264 out.flv

    左はそのまま、右に unsharp フィルタを適応し ffplay でプレビュー
    ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w

    上はそのまま、下に unsharp フィルタを適応し ffplay でプレビュー
    ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=0:2*ih[A];[b]unsharp[B];[A][B]overlay=0:h

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

    出力解像度を小さくする場合には末尾にスケールフィルタを当てる
    ffplay -rtbufsize 100MB -f dshow -i video="SCFH DSF" -vf split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w,scale=320:-1

    FFML でフィルタ比較をする場合には「フィルタを有効にする」にチェックを入れて、「split[a][b];[a]pad=2*iw[A];[b]unsharp[B];[A][B]overlay=w」をコピペする。
    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 及び総評
    ぼやけた画像からドット絵を抽出する - Post - Seaside Laboratory

    sab(強力な2次元デノイザ)


    詳しくはこちら:強力な2次元デノイザ sab

    unsharp(鮮鋭化フィルタ)


    線をクッキリ、またはぼんやりさせるフィルタ。既定値ではクッキリしすぎて映像が変わりすぎるので最低限にとどめたほうが良い。


    -vf unsharp=luma_msize_x:luma_msize_y:luma_amount: chroma_msize_x:chroma_msize_y:chroma_amount:opencl

    • luma_msize_x
      輝度マトリックスの横軸。3から63までの奇数の整数で、既定値は 5
    • luma_msize_y
      輝度マトリックスの縦軸。3から63までの奇数の整数で、既定値は 5
    • luma_amount
      輝度マトリックスの影響度。-1.5 から 1.5 の小数点を含む値で、既定値は 1.0
      マイナスの値でぼやかし、プラスの値でクッキリさせる。0 は効果無し
    • chroma_msize_x
      彩度マトリックスの横軸。3 から 63 までの奇数の整数で、既定値は 5
    • chroma_msize_y
      彩度マトリックスの縦軸。3 から 63 までの奇数の整数で、既定値は 5
    • chroma_amount
      彩度マトリックスの影響度。-1.5 から 1.5 の小数点を含む値で、既定値は 0.0
      マイナスの値でぼやかし、プラスの値でクッキリさせる。0 は効果無し
    • opencl
      opencl の使用可否で、既定値は 0。使用には --enable-opencl が必要


    既定値でフィルタを当てる場合には
    ffmpeg -i in.mp4 -vf "unsharp" out.mp4
    ffmpeg -i in.mp4 -vf "unsharp=5:5:1.0:5:5:0.0" out.mp4

    しかしこのままだとクッキリしすぎるので値を小さくする。

    ffmpeg の出力例
    ffmpeg -i in.mp4 -vf "unsharp=3:3:0.5:3:3:0.5:0" out.mp4

    参照リンク
    FFmpeg documentation : : unsharp

    eq(明暗調整)


    mplayer wrapper が ffmpeg 2.6 から廃止されたので、mp eq の代わりに eq を使う。
    YUV 映像にオプションの gamma 関係を使っても出力フォーマットは RGB に変わらない。RGB24 で入力しても出力フォーマットは yuv420p になる。


    -vf "eq=contrast=1:brightness=0:saturation=1:gamma=1: gamma_r=1:gamma_g=1:gamma_b=1:gamma_weight=1"
    -vf eq=1:0:1:1:1:1:1:1

    • contrast
      コントラスト:-2.0 から 2.0 までの float、既定値は 1
      上げると暗く締まった感じに、下げると明るくぼやけた感じに。YUV だと Y にだけ影響がある。
    • brightness
      輝度:-1.0 から 1.0 までの float、既定値は 0
      上げると明るく、下げると暗くなる。YUV だと Y にだけ影響がある。
    • saturation
      彩度:0.0 から 3.0 までの float、既定値は 1
      上げるとはっきりとした色に、下げるとモノクロに近づく。YUV だと UV に影響がある。
    • gamma
      ガンマ(階調度)、赤青緑全ての影響:0.1 から 10.0 までの float、既定値は 1
      上げると階調が広がる(明るく)、下げると階調が狭まる(暗く)
    • gamma_r
      赤色ガンマ:0.1 から 10.0 までの float、既定値は 1
    • gamma_g
      緑色ガンマ:0.1 から 10.0 までの float、既定値は 1
    • gamma_b
      青色ガンマ:0.1 から 10.0 までの float、既定値は 1
    • gamma_weight
      ガンマ強度、ガンマ設定したのを全体的にどれだけ影響させるか。0 ほど影響がない。
      0.0 から 1.0 までの float、既定値は 1
    • eval
      計算書式に使う変数を最初の値のままにするかフレーム毎に読み込むか
      init:そのまま(既定値)、frame:フレーム毎
    • 計算書式に使える変数
      n:フレーム数、最初は 0, pos:バイトポジション, r:フレームレート, t:タイムスタンプ秒

    計算書式の例
    1秒ごとに明るくなり、10秒たつと元に戻るのを繰り返す
    ffplay -f lavfi testsrc,eq=eval=frame:brightness="mod(t\,10)/10"

    参照リンク
    FFmpeg Filters Documentation :: eq

    mp-eq(明暗調整)(旧仕様)


    映像全体を明るくしたり暗くしたり、はっきりした色に調整する。実際の明度調整は下のカラーバランスフィルタを推奨。mp の映像フィルタ系列は ffmpeg 2.6 で廃止になった。


    -vf mp=eq=brightness:contrast

    brightness は輝度 -100 から 100 まで +1毎にRGBが2程度大きくなり明るくなる。
    contrast はコントラスト比 -100 から 100 まで 配信用途では特に変更しない。

    ffmpeg の出力例
    ffmpeg -i in.mp4 -vf mp=eq=3:0 out.mp4

    参照リンク
    ITmedia +D PCUPdate:輝度とコントラスト比は高いほど良いのか? (1/2)
    MPlayer

    LUT(ルックアップテーブル、ラット)


    YUV(A), RGB(A), GRAY(ffmpeg 4.0 以降) データを任意に調整できるフィルタ。上の eq よりも直感的に設定できる。eq は平均的に上げ下げできるのに対して、lut は val を使うことで元の数値が大きいほど効果が強くなる。入力するデータによってフィルタ名を変えて使う。YUV なら lutyuv, RGB なら lutrgb。GRAY を含めてプレーン順で指定する場合は lut を使う。

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

    • c0
      最初のチャンネルを指定
    • c1
      2番目のチャンネルを指定
    • c2
      3番目のチャンネルを指定
    • c3
      4番目のチャンネルを指定。一般的にはアルファチャンネル
    • r
      RGB の R を指定
    • g
      RGB の G を指定
    • b
      RGB の B を指定
    • a
      アルファチャンネルの指定。8bit 深度なら 255 で透過せずに、0で完全透過になる
    • y
      YUV の Y(輝度)を指定
    • u
      YUV の U/Cb(青)を指定
    • v
      YUV の V/Cr(赤)を指定

    使える書式

    • w
      入力した映像の横幅
    • h
      入力した映像の縦幅
    • val
      入力した映像の値
    • clip
    • maxval
      入力した映像の最大値
    • minval
      入力した映像の最小値
    • negval
      入力した映像の反転値
    • clip(val, minval, maxval)
      3つの引数をとり、minval から maxval までのレンジを返す。int を代入するとレンジを狭めたりできる
      数値があふれた場合は、minval , maxval の値で出力される
    • clipval
      TVスケールにクリップする
    • gammaval(gamma)
      pow((clipval-minval)/(maxval-minval),gamma)*(maxval-minval)+minval

    書式を利用した例
    明るいところ、暗いところにフィルタを当てる

    参照リンク
    FFmpeg Filters Documentation :: lut, lutrgb, lutyuv

    カラーバランス


    赤緑青(RGB)それぞれを明暗別に色を調整する。暗いところだけを明るく、明るいところだけを暗くするなど ピンポイントで調整できる明暗調整は上の mp フィルタよりもこちらを推奨。。RGB 変換が挟むので RGB 入力以外の場合はあまりお奨めしない。

    すべての値は -1.0 から 1.0 まで 0.01 から指定でき、既定値は 0
    マイナスの値で暗くし、プラスの値で明るくさせる。0 は効果無し

    • rs, gs, bs
      赤(rs) 緑(gs) 青(bs) の暗部だけを調整する
    • rm, gm, bm
      赤(rm) 緑(gm) 青(bm) の中間部だけを調整する
    • rh, gh, bh
      赤(rh) 緑(gh) 青(bh) の明部だけを調整する


    赤緑青の暗部だけを少しだけ明るくする
    -vf colorbalance=rs=0.02:gs=0.02:bs=0.02

    赤緑青の明部だけを少しだけ暗くする
    -vf colorbalance=rh=-0.01:gh=-0.01:bh=-0.01

    赤緑青の暗部だけを少しだけ明るくし、赤緑青の明部だけを少しだけ暗くする
    -vf colorbalance=rs=0.02:gs=0.02:bs=0.02:rh=-0.01:gh=-0.01:bh=-0.01

    ffmpeg の出力例
    ffmpeg -i input.mp4 -vf colorbalance=rs=0.02:gs=0.02:bs=0.02 output.mp4

    参照リンク
    FFmpeg documentation : : colorbalance

    selectivecolor(特定色の調整)


    colorbalance では RGB を明るくしたり暗くしたり出来たが、selectivecolor はより詳細に色の調整が出来る。

    詳しくは RGB, CMYK を個別に調整できる selectivecolor を参照。

    concat


    映像だけ、音声だけ、映像と音声を一緒に後ろにつなげる。手元にあるファイルを配信を止めずに続けて配信するときに使う。

    ffmpeg -hide_banner -stream_loop -1 -re -f concat -i input.ffconcat -c copy -f flv rtmp://ip-addr/live

    input.ffconcatの内容。
    ffconcat version 1.0
    # コメント行 https://ffmpeg.org/ffmpeg-all.html#Syntax-1
    file 1.flv
    file 2.flv
    file 3.flv


    詳しくは【ffmpeg】動画・音声を連結する concat の使い方 其の3を参照。

    pad


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


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

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

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

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


    • 上に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw:ih+40:0:40"
    • 下に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw:ih+40:0:0"
      ffplay -f lavfi -i testsrc -vf "pad=0:ih+40"
    • 右に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih:0:0"
      ffplay -f lavfi -i testsrc -vf "pad=iw+40:0"
    • 左に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih:40:0"
    • 右下に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih+40"
    • 左上に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw+40:ih+40:40:40"
    • 上下左右に40pxの黒の余白
      ffplay -f lavfi -i testsrc -vf "pad=iw+80:ih+80:40:40"

    iw と ih は入力データの横と縦の解像度。scaleやpad、cropで使われる。

    オーバーレイとパドを使って横に2画面映像を付けることができる。注意点は同じ解像度であることと、最初に入力した動画の音声が流れる。

    例:解像度半分に左右に配置
    ffplay -f lavfi -i testsrc -vf "split[a][b],[a]scale=iw/2:ih/2,pad=2*iw:ih[left];[b]scale=iw/2:ih/2[right];[left][right]overlay=W/2:0"

    例:解像度同じで左右に配置
    ffplay -f lavfi -i testsrc -vf "split[a][right],[a]pad=2*iw:ih[left];[left][right]overlay=W/2:0"

    ffmpeg の出力例
    ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -x264-params "colormatrix=smpte170m" -pix_fmt yuv420p -vf "pad=iw:ih+40:00:40" -vcodec libx264 -crf 27 -acodec libmp3lame -ar 44100 -ab 80k hoge.flv

    異なる音声を左右で流す方法はダウンチャンネルして左右に割り振るとできると思うが未確認。
    できることを確認。2012年8月14日

    例 infile1 を左に infile2 を右に解像度を半分にして音声も同様に配置
    -i infile1 -i infile2 -filter_complex "[0:0]scale=iw/2:ih/2, pad=2*iw:ih [left] ;[1:0]scale=iw/2:ih/2 [right] ;[left][right] overlay=W/2:0; [0:1]pan=stereo:c0=c1[a];[1:1]pan=stereo:c1=c0[b];[a][b]amix"

    このとき librtmp でライブストリーミングを取り込むと音声が早く終わることを確認。同期方法は未確認。

    参照リンク

    音声合成


    音声ファイルや音声デバイスを合成(マルチトラックではない)する。-i で入力した音声を -map で指定しフィルターを掛けて合成することもできる。

    詳しいオプション説明
    ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT


    • inputs[int]
      取り込む音声の数
      既定値:2

    • duration[int]
      複数の音声の再生時間が異なる場合にどちらの出力を優先するかのオプション

      • 0, longest
        長い方。既定値

      • 1, shortest
        短い方

      • 2, first
        最初に入力した方


    • dropout_transition[float]
      音声のエンコードが終わって他が続いている場合にその終わり方にフェードアウトする秒の指定
      既定値:2

    • weights[string]
      取り込む音声の数
      既定値:"1 1"


    aundio1.m4a と aundio2.m4a を合成する例
    -i aundio1.m4a -i aundio2.m4a -filter_complex amix -acodec 以下略

    dshow の映像と2つの音声(PC音とマイク)を合成する例
    -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -f dshow -i audio="マイク (Realtek High Definition Au" -filter_complex amix -pix_fmt yuv420p -vcodec ... -acodec ... 以下略

    video1.mp4 と video2.mp4 の音声を -map で指定してフィルターを掛けて合成する例
    -i video1.mp4 -i video2.mp4 -filter_complex "[0:1] filter [L], [1:1] filter [R], [L][R] amix" -acodec 以下略

    ここで dshow で音声を複数取り込む場合に何も指定しないと初期タイムスタンプが異なることになり、音声がずれる原因になる。その場合には asetpts=PTS-STARTPTS フィルターを使う。効果は未確認。
    asetpts は古い ffmpeg では使えない。


    ffmpeg -rtbufsize 100MB -f dshow -i video="SCFH DSF":audio="AmaRec Core Audio Capture" -f dshow -i audio="マイク (Realtek High Definition Au" -filter_complex "[0:1] aresample=44100,asetpts=PTS-STARTPTS [L]; [1:0] aresample=44100,asetpts=PTS-STARTPTS [R] ; [L][R] amix" -pix_fmt yuv420p

    Libav documentation : : 19.19 overlay より

    各入力映像から取られるフレームはタイムスタンプの順であることを意識すること。 したがって、それらの初期タイムスタンプが異なるなら、setpts=PTS-STARTPTS フィルターに通し、それらが同じゼロタイムスタンプから始まるようにして (movie フィルターの例で行っているように )2つの入力を渡すことは 良い考えである。



    ちなみに似たようなフィルターに amerge がある。こちらも音声を合成するが、合成すると合成した分だけチャンネル数が増える。

    参照リンク

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


    入力した音声のサンプリング周波数を調整する。

    例 入力した音声を44.1kHzに調整する
    aresample=44100

    soxをインストールしていれば
    aresample=44100:resampler=soxr

    ffmpeg の使用例
    ffmpeg -i audio -filter_complex "aresample=44100" -acodec 以下略

    参照リンク
    FFmpeg documentation : : aresample

    音声配置


    音声のチャンネル配置、音量割合を変更する。

    c0=左 c1=右

    例 ステレオの左チャンネルを9、右チャンネルを1の割合で音量を変えてモノラルにする。合計は1になるようにする
    pan=1:c0=0.9*c0+0.1*c1

    例 左を無音にしてステレオを維持する
    pan=stereo:c1=c1

    例 右を無音にしてステレオを維持する
    pan=stereo:c0=c0

    各ステレオの音声 audio1 を左、audio2 を右に配置して音声合成
    -i audio1 -i audio2 -filter_complex "[0:0]pan=stereo:c0=c1[a];[1:0]pan=stereo:c1=c0[b];[a][b]amix"

    参照リンク

    各チャンネルの音声を合わせたり調整する pan
    AudioChannelManipulation – FFmpeg

    音量調整


    入力した音声の音量を調整する。既定値は1.0

    自動的に音量に合わせて調整する場合は dynaudnorm を使う。
    ffmpeg で聞き取りやすい音量に変える

    音量を半分にする方法は2種類ありどちらも同じ結果になる
    volume=0.5
    volume=1/2


    またデシベル指定で音量を調整できる

    例 入力した音声の音量を12dB小さくする
    volume=-12dB

    例 入力した音声の音量を12dB大きくする
    volume=12dB

    ffmpeg の使用例
    ffmpeg -f lavfi -i "amovie=audio,volume=0.5" -acodec 以下略
    ffmpeg -i audio -filter_complex "volume=-12dB" -acodec 以下略
    ffmpeg -i audio -af "volume=-12dB" -acodec 以下略

    参照リンク
    FFmpeg documentation : : volume

    音量の圧縮・伸張


    入力した音声から指定したデシベルを指定したデシベルに変換する。つまり、特定の音量を消したり(ノイズゲート)大きくしたり小さくしたりできる。

    基本コマンド
    -af "compand=attacks=0.3 0.3:decays=0.8 0.8:points=-90/-900 -34.6/-34.6 -22/-21:soft-knee=0.01:gain=0:volume=0:delay=0.8"

    スペースの部分は | に置き換えることができる
    -af "compand=attacks=0.3|0.3:decays=0.8|0.8:points=-90/-900|-34.6/-34.6|-22/-21: soft-knee=0.01:gain=0:volume=0:delay=0.8"

    設定名は省略できる
    -af "compand=0.3 0.3:0.8 0.8:-90/-900 -34.6/-34.6 -22/-21:0.01:0:0:0.8"

    さらに 0.1 は .1 でも機能する。
    -af "compand=.3 .3:.8 .8:-90/-900 -34.6/-34.6 -22/-21:.01:0:0:.8"

    • attacks[string]
      最大音量になるまでの秒時間が指定した時間以上のときにフィルタを当てる。0だと即時反映する。チャンネル毎に半角スペースか|で区切って指定する。チャンネル毎に指定しないときは最後の指定値が他の指定値になる
      既定値:0(秒)
    • decays[string]
      attacks後の減退秒時間の指定。チャンネル毎に半角スペースか|で区切って指定する。チャンネル毎に指定しないときは最後の指定値が他の指定値になる
      既定値:0.8(秒)
    • points[string]
      /の左が入力値、右が出力値の音量をdB単位で変更する。入力値は単調増加で出力値はそうでなくてもよい。|で区切って複数の支点を指定する
      既定値:"-70/-70|-60/-20|1/0"
    • soft-knee[double]
      pointsの支点毎の音量変更の曲線をdB単位で指定する
      範囲:0.01から900まで
      既定値:0.01(dB)
    • gain[double]
      pointsで指定したデシベルの値のすべてに指定値だけ値を増やす
      範囲:-900から900まで
      既定値:0(dB)
    • volume[double]
      音量の初期値の指定。限りなく静かな音となる典型的な値は-90dBである
      範囲:-900から0まで
      既定値:0(dB)
    • delay[double]
      秒単位の遅延の指定。attackdecaysとほぼ同じ値にすると反応モードではなく予測モードになり効果的に動作する
      範囲:0から20
      既定値:0(秒)


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

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

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

    ffmpeg で調べる方法
    ffmpeg で聞き取りやすい音量に変える
    適切な音量が調べられる ffmpeg の ebur128 の使い方

    この中から適当なのを選んで調べてみる。
    水おいしいです^o^: 音量・レベルメータ ソフト

    この中で WaveSpectra は使いやすくておすすめ。
    高速リアルタイム スペクトラムアナライザー WaveSpectra

    ダウンロードは下の方にある「WS151.ZIP をダウンロード」から保存する。
    音声ファイルは .wav 形式だけが読み込める。PC上でリアルタイムに鳴っている音を解析するには設定から「再生/録音」タブより再生デバイスに音を鳴らすデバイスを指定し、録音デバイスをPCで鳴っている音を拾うステレオミキサーか仮想デバイスを指定する。ステレオミキサーがない人向けに今回は VB-CABLE を使う。

    VB-Audio Virtual Apps

    VB-CABLE Driver (Donationware) を保存し、32bit OS なら VBCABLE_Setup、64bit OS なら VBCABLE_Setup_x64 をインストールする。次にコントロールパネルの音声デバイスの 再生タブ の「CABLE Input」を有効にして 規定のデバイス にし、録音タブ では「CABLE Output」の録音デバイスの聴くタブから このデバイスで聴くにチェックを入れて その下のデバイス選択を普段聴いているスピーカーのデバイスを指定する。そして、WaveSpectra の録音デバイスには「CABLE Output (VB-Audio Virtual」を指定する。音が多重に聞こえる場合はこのデバイスで聴くにチェックを入れない。

    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"

    参照リンク


    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 フィルタよりも手軽に立体音響っぽくするフィルタ。ネイティブフィルタなので別途ライブラリをインストールする必要が無い。変化した位相はaphasemeterフィルタで確認できる。

    基本コマンド
    -af stereowiden=delay=20:feedback=.3:crossfeed=.3:drymix=.8

    設定内容


    既定値のままだと音量が小さくなるので、drymix を上げるか、volume フィルタで音量を上げる。

    • delay
      遅延の設定。1 から 100 まで(単位ミリ秒)
      この値を大きくすることで手軽に音の広がりが増す。
      既定値:20
    • feedback
      feedback の音量。0 から 0.9 まで
      既定値:0.3
    • crossfeed
      crossfeed の音量。0 から 0.8 まで
      既定値:0.3
    • drymix
      音量の調整。0 から 0.9 まで
      既定値:0.8

    参照リンク
    FFmpeg Filters Documentation :: stereowiden

    入力フィルタの使い分け


    • map 指定することで的確にフィルタを適用できる。
    • フィルタ毎は , で区切り、別データを取り込むには ; で区切る。
    • フィルタを通すと無圧縮データとして出力される。
    • フィルタ内でファイルを取り込む movie|amovie を使うと無圧縮データとして入力される。
    • フィルタの最初に[in],[0:0]などで外部から取り込み、フィルタの最後で[L][R][a0]などどして他のフィルタの目的とする。

    • filter_complex
      ffplay では再生できない
      vf と af で同様の使い方ができる
      filter の最後に [out] を付けない
      複数の i を map 指定してフィルタを適用できる
      映像フィルタと音声フィルタを同時に掛けられる

      コマンド例
      -i infile -filter_complex "<filters>"
      -i infile1 -i infile2 -filter_complex "[0:0]<filters>[L];[1:0]<filters>[R];[L][R] overlay"
      -i infile1 -i infile2 -filter_complex "[0:0]<filters>[L];[1:0]<filters>[R];[L][R] overlay;amix"

      ffmpeg の出力フォーマットを SDL にすることで複数入力の filter_complex でもプレビューできる
      -i infile1 -i infile2 -filter_complex "<filters>" -f sdl -

    • vf,af
      vf はビデオフィルタ
      af はオーディオフィルタ
      1入力1出力しか出来ないが、同じ入力なら split|asplit で増やすことが可能
      af は ffplay で再生できない
      i は最初に [in] でフィルタ内に取り込む
      フィルタ内のデータの取り込みは vf は movie 、af は amovie フィルタを使う
      ライブストリーミングを i と movie で同時に取り込むとそれぞれにラグが発生する

      コマンド例
      -i infile -vf "<filters>"
      -i infile -vf "[in]<filters>[L];movie=infile ,<filters>[R];[L][R] overlay"

    • lavfi
      f は入出力フォーマットを決めるオプション
      ffplay で複数のファイルを読み込むのに重宝する
      フィルタ内のデータの取り込みは movie|amovie フィルタが使える
      出力されるデータの映像は rawvideo、音声は pcm_f32le になる

      filename
      入力ファイル名、ローカルファイルだけではなく特定のプロトコルも入力できる
      format_name, f
      指定したフォーマットで読み込む。無指定だと入力ファイルから特定する
      seek_point, sp
      指定した秒から入力する。既定値は 0
      streams, s
      入力したストリームを特定する。dv が映像、da が音声。それぞれ入力する場合は + でつなげる

      コマンド例
      ffmpeg -f lavfi -i movie=infile:sp=3:s=dv+da[v][a];[v]trim=duration=2[out0];[a]atrim=duration=2[out1] outfile
      ffplay -f lavfi -i movie=infile:s=dv+da[out0][out1]

      -i video -f lavfi -i "amovie=audio1,<filters>[a0];amovie=audio2,<filters>[a1];[a0][a1] amix"
      -f lavfi -i "color ,<filters>"

    FFmpeg Devices Documentation : lavfi

    注意点


    テストの過程でわかったことの列記
    • PCが耐えられる以上のエンコード負荷をかけると音声が正しくエンコードされなくなる(音がプツプツになる)。
    • 負荷が高いと配信fpsが指定fps以下になるので、その場合は解像度、fps、エンコード設定、libx264 の threads を論理コア数にする、ffmpeg の優先順位を見直す。
    • ffmpeg で入力ファイルをデコードしてエンコードする場合には colormatrix を付けないと色がおかしくなる。
      例:ffmpeg -i video.mp4 -x264-params "colormatrix=smpte170m" -vcodec ...
      FFML を使って配信している場合は
      高度な設定 タブ < コーデック タブ < x.264 形式のプリセット指定 (-x264-params) に colormatrix=smpte170m を入力する

      訂正 2012/09/02
      flash での再生確認では -vf colormatrix=bt601:smpte240m と -x264-params "colormatrix=smpte170m" は差がなかったが、directshow ベースの動画プレイヤーで再生すると前者は色が変わったので、後者に訂正した。
      詳しい仕様については 金の髭さんのコメント505番 を参照ください。


    未解決なこと


    Dxtoryを入力ソースに使えない。avs経由だと読み込めないが、dshowだと読み込める。同様にXSplitもdshow経由だと読み込めるが凄まじく処理落ちする

    追記 2012年3月24日
    PCのHDDをSSDに変えるとdshow読み込みでも処理落ちしなくなり、ゲーム配信ができるようになった。同時にNDCやSCFH DSFでも処理落ちしなくなった?
    libavcodec will support Dxtory soon for playback

    追記 2012年3月30日
    激しく処理落ちする場合に -rtbufsize を指定すると処理落ちが無くなる。とりあえず 102400000 を指定しておけば処理落ちはなくなった。dshow読み込みをせずにavs読み込みで -rtbufsize を付けずにバッファーエラーが出ない場合は付けなくても良い。


    ffmpeg -rtbufsize 100MB -f dshow -i video="Dxtory Video 1":audio="AmaRec Core Audio Capture" -r 24 -vcodec libx264 -crf 27 -acodec aac -ar 44100 -ab 80k -bufsize 600k -maxrate 300k -f flv rtmp://...

    【ffmpeg】 dshow 入力したソースを lavfi で使う方法がわからない → -filter_complex で amix を使うことで解決

    追記 2012年8月4日 2013年7月30日
    フィルターの使い分け
    filter_complex, vf, af, lavfi
    それぞれの使い分けかた。入力方法が少し違うのと ffplay で再生できるかに違いがあり、ffplay では2以上の同じタイプの入力ファイルを扱えない。filter_complex は2以上入力できるのに対して、vf, af は1つしか入力できない。lavfi はベンチマークがあまりよろしくない。

    追記 2012年8月11日
    音声デバイスを複数取り込んで amix する場合にそのデバイス間で音がずれることが確認されている。原因はそれぞれのデバイスに設定されているアロケーターサイズが異なるから。

    詳しくは以下の放送を参照
    ffmpeg単体でのステミキと音ずれ問題について - ニコニコ生放送

    放送のスクリーンショット。サイズが大きいので画像リンク
    lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_1
    lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_2
    lv102887194_ffmpeg単体でのステミキと音ずれ問題について_vpos3300_4

    キャプチャを開始してすぐにエンコードをするのではなくて、-ss を指定してエンコード開始待ち秒(小数点可能)指定しアロケーターの開始位置が近しくなるようにエンコードしてみると、映像のオーバーレイの場合には同期できることが分かった。音声(amix)は未確認。

    追記 2012年8月14日
    overlay と amix を併用して librtmp でライブストリーミングを取り込むと音声が早く終わることを確認。同期方法は未確認。

    参照リンク
    [FFmpeg-user] How to set video size when using -f dshow?

    その他の参照リンク



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

コメント

金の髭

注意点の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で問題ないとは思います。

金の髭

追記:
●「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
 となるかと思います。

ロベルト

Re: タイトルなし
金の髭 さん指摘ありがとうございます。

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

少佐

一部の項目の記述は省略しますが、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の外で記述したほうが良いかと思われます。

少佐

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

ロベルト

Re: タイトルなし
少佐 さんこんばんは

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

少佐

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」の値に指定する。

ロベルト

Re: タイトルなし
少佐 さんこんにちは

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

少佐

デロゴフィルターについて
先日たまたまデロゴフィルターを設定してみる機会があったときに発見しました。
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 の解像度

少佐

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

すぺt

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

ロベルト

Re: タイトルなし
すぺt さん指摘ありがとうございます。

記事に反映しました。
非公開コメント

プロフィール

ロベルト

お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab

広告リンク
Amazon
楽天市場

ブログ更新用 @blo_nico_lab

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

当ブログは、Amazonアソシエイトに参加しています。