🐈

gstreamerでSRTのパイプラインを作ってみる。

2024/11/27に公開

IPカメラから受け取ったRTSPのソースをSRTに変換して受信するような感じ。
遠隔操作なんかで需要がありそうなパイプライン
AXISのカメラを使った例

gst-launch-1.0 rtspsrc location=rtsp://ユーザー:パスワード@ipアドレス/axis-media/media.amp?videocodec=h265 latency=1 ! rtph265depay ! mpegtsmux ! srtsink uri="srt://:12345"

車両に防水のアクシスカメラを取り付けてて、gstreamerが動くPCを置いて上に書いたパイプラインを参考にサーバーとする。

カメラからはH265で受けているのでエンコードとかデコードはしないでストリームから受けてdepayしてsrtの作法に沿ってmpegtsmuxしてsrtserversinkでポートをあけて待っている感じにする。
利点としては、エンコードはIPカメラで行うため、たぶんMP135のような非力な機器でもSRTの威力が出ると思われることだ。
AXISのカメラであれば、有料パッケージだがcamstreamerというアプリがあるので実際のところはそれを使った方が良いと思う。

受信側はこんな感じだ。

gst-launch-1.0 srtsrc uri="srt://ipアドレス:12345" ! tsdemux ! h265parse ! avdec_h265 ! videoconvert ! autovideosink sync=false

受信側ではデコードが必要になる。お作法通りtsdemuxしてh265で受けているのでh265parseし、h265でデコードする。デコードは表示させるPCのCPUパワーがある場合はavdec_h265がよさそうだがインテル環境ならqsvh265decもよさそうだ。
videoconvertは最新版のgstreamerなら必要ないが念のため入れてある。
autovideosinkにしておけばWindowsの場合はDirectX11が選ばれる。
syncはfalseにしておけば垂れ流しになるのでここで遅延は起きないようだ。
nvdec_h265は環境がないので試していない。

追記。受信側は実はもっと簡単になる。

gst-launch-1.0 srtsrc uri="srt://ipアドレス:12345" ! decodebin ! autovideosink sync=false

decodebinというのはデコード周りを良い感じにまとめてくれる便利binである。
これを使うと自動でやってくれる。しかしながらデコーダーを自分で吟味したいとかなら最初に提示したパイプラインのデコーダー部分をいろいろ変更してみるのが良いだろう。
decodebin3 でもよい。decodebin3はバッファリング処理がなく前段ですることを前提にしているようで、srtはバッファリングもsrtの機能なのでもしかしたらdecodebin3の方が良いかもしれない

私はまだ突き詰めてはいないが、少なくともエンコードに関しては、結果の品質がエンコーダーによって違うようだし、デコーダーは遅延に関係してくるし、回線品質によって画面のブロックノイズなどの出かたが変わる。まあSRTを使うとそこらへんがずいぶんよくなるのでSRTを使うのだが。

USBカメラなどの例はよく見かけるが、RTSPをソースにしたものはあんまり内容だったのでここに残しておきます。

Discussion