注意
使用は自己責任でお願いします。
また、多少の画像の乱れを容認してでも遅延を少なくするオプションを入れています。
グリッチングが気になる場合や回線状況が良くない場合は適宜調整してください。
ビットレートやポート番号はあくまで例です。
本編
主に2PC配信向け、動画のみ
srt+X11grab
送信
1920x1200,30FPS,Mpeg4,50000k
ffmpeg -f x11grab -r 30 -s 1920x1200 -i :0.0+0,0 -q:v 0 -f avi -fflags nobuffer -flags low_delay -strict experimental -b:v 50000k srt://X.X.X.X:10002?latency=120
受信
ffplay srt://X.X.X.X:10002?mode=listener&latency=120 (-fflags nobuffer -flags low_delay -strict experimental -framedrop)
V4L2 to srt
動作確認ソース:/dev/video3(V4L2Loopback),1920x1080,30FPS
ffmpeg -i /dev/video3 -f avi -b:v 12000k -qscale:v 2 -fflags nobuffer -flags low_delay -strict experimental "srt://X.X.X.X:10001?latency=120"
受信側は上に同じです。
srt+qsv
負荷は減ります。遅延は増えます。intelの一部のCPUでしか利用できません。
intel-media-sdk(archの例。或いは相当のパッケージ)が必要です。
Decode
例:qsvでh264をdecode、V4L2Loopbackに流す
ffmpeg -hwaccel qsv -hwaccel_device /dev/dri/renderD128 -c:v h264_qsv -i "srt://X.X.X.X:10000?mode=listener&latency=120" -vf hwdownload,format=nv12 -pix_fmt yuv420p -f v4l2 /dev/video0 -fflags nobuffer -flags low_delay
Encode
例:V4L2のデータをqsvでmpeg2にencode、srtで流す
ffmpeg -hwaccel qsv -hwaccel_device /dev/dri/renderD128 -i /dev/video3 -f mpegts -c:v mpeg2_qsv -b:v 12000k -fflags nobuffer -flags low_delay "srt://X.X.X.X:10001?latency=120"
おまけ
リアルタイム配信のミソ
FFMpeg / FFPlay 汎用
-fflags nobuffer -flags low_delay -strict experimental
※画像の乱れはスルー
FFPlay only
-framedrop
srt
ffmpegやそれを用いているソフト(OBS等)で最近導入されたストリーミングプロトコル。
オープンソース。
パケット損失に強いと謳っています。
色々試した結果通信断には対応できますが一度ストリームを終了させたあとで受信を終了させずに新たなストリームを開始させると問題が起こるようです…残念
オプションはHTTPのGETリクエストのURLパラメータのような形式で入力します。
Modeオプション・URL形式
ListenerモードとCallerモードがあり、受け手・送り手双方から通信を開始することが出来ます。
例えばListenerモードで接続を待ち受けるには、
srt://X.X.X.X:12345?mode=listener
のようにします。
ポート設定は必須です。逆に待ち受け側にはipを入力しなくても動きます。
OBSで利用したい
上の形式のURLをメディアソースとして入力してやれば良いです。
配信側として使いたい場合も同様にカスタム配信サーバーのアドレス欄に上記の形式のURLを入力します。
スマホのカメラ・画面をsrtしたい
Larix Broadcaster辺りが対応しているようです。
Latencyオプション
Haivision Blog
デフォルトの120以下にしてはいけません。パケット損失耐性が失われてしまうそうです。
ミリ秒ではないので注意が必要です。
本当はsrtを利用する際maxbw(最大で利用できる帯域幅のオプション)も設定することが推奨されているようです。