JavaScriptを有効にしてください

2PCオンライン会議でFFMpegとsrtを使う

 ·   ·  ☕ 3 分で読めます

注意

使用は自己責任でお願いします。
また、多少の画像の乱れを容認してでも遅延を少なくするオプションを入れています。
グリッチングが気になる場合や回線状況が良くない場合は適宜調整してください。
ビットレートやポート番号はあくまで例です。

本編

主に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(最大で利用できる帯域幅のオプション)も設定することが推奨されているようです。

共有

hayabusa2yk
著者
hayabusa2yk
Dev/Admin of servers