2016-10-19 29 views
0

Jetson TX1のGstreamerを使用してUDPまたはTCP経由でビデオフレームを送受信したいとします。Jetson TX1のUDP/TCP経由のGstreamer送信者と受信者

以下のようにビデオフレームを送信できます。

送信者:

gst-launch-1.0 nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' ! nvvidconv flip-method=2 ! udpsink host=<BCast IP addr> auto-multicast=true port=8089 

受信機:

gst-launch-1.0 -v udpsrc port=8089 ! ... ! nvoverlaysink -e 

UPDATE:これは罰金見えた、しかし、受信機にはまだ黒いフレーム。

gst-launch-1.0 -v udpsrc port=8089 ! capsfilter caps='video/x-raw(memory:NVMM),width=244,height=244, format=I420, framerate=20/1' ! nvoverlaysink -e 

"受信者"側でどのフィルタを追加する必要があるのか​​分かりません。 (ビデオキャプチャを試しましたが、エラーが発生しました: "ビデオクリップ:イベントが見つかりません") また、pythonスクリプトを使用して各ビデオフレーム(画像)をキャプチャする方法はありますか? 最終的に、私はjpegまたはpng形式で各フレームをpythonスクリプトを使ってキャプチャしたいと思います。 受信者が送信者(ビデオsrc)からデータを取得できるかどうかはテストできますが、上記の問題がまだあります。

import socket 
import sys 
import time 

HOST = '' # Symbolic name meaning all available interfaces 
PORT = 8089 # Arbitrary non-privileged port 

# Datagram (udp) socket 
try : 
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    print 'Socket created' 
except socket.error, msg : 
    print 'Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
    sys.exit() 


# Bind socket to local host and port 
try: 
    s.bind((HOST, PORT)) 
except socket.error , msg: 
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
    sys.exit() 

numFrames = 0 
while 1: 
    # receive data from client (data, addr) 
    d = s.recvfrom(4096) 
    data = d[0] 
    addr = d[1] 

    if not data: 
     break 

    reply = 'OK...' + data 

    s.sendto(reply , addr) 
    print 'Message[' + addr[0] + ':' + str(addr[1]) + '] - ' + data.strip() 

答えて

1

質問の最初に答えるために、あなたはudpstreamingに適したペイロードにパケットをエンコードする別のGStreamerの要素rtpvrawpayを含める必要があります。 rtpvrawpayはnvidiaビデオを受け入れないので、nvvidconvを強制的に通常のvideo/x-rawに変換するように上限を変更します。

gst-launch-1.0 -e nvcamerasrc ! 'video/x-raw(memory:NVMM), width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' ! nvvidconv flip-method=2 ! 'video/x-raw, width=(int)1024, height=(int)720, format=(string)I420, framerate=(fraction)30/1' ! rtpvrawpay ! udpsink host=<BCast IP addr> auto-multicast=true port=8089 

有効なストリームが得られるはずです。我々は、単に標準的なビデオ/ X-生NVMM形式を取っていないしている

gst-launch-1.0 -v udpsrc port=8089 ! rtpvrawdepay ! capsfilter caps='video/x-raw,width=244,height=244, format=I420, framerate=20/1' ! nvoverlaysink -e 

注: は、ペイロードを試してdepayします。あなたは

gst-inspect-1.0 nvoverlaysink 

を行う 場合、あなたはそれがNVMMまたは標準的なX-生の映像を受け入れ表示されます。

また Stream H.264 video over rtp using gstreamer ...この答えを見てridgerunパイプライン:コマンドラインからそれらを実行している場合、私はあなたのGStreamerのパイプラインに-eを追加 https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Tegra_X1

注意それ以外はCtrl-Cは閉じませんストリームは適切に。 2番目の質問は大きな課題です。 https://github.com/markw63/pythongst/blob/master/README.md は、appsinkを使用してこのタイプのジョブを実行するコードの例です。 このコードはカメラからビデオとオーディオを取得しますが、上記のようにudpsrcからコードを簡単に取得し、appsinkに接続して、各バッファ(通常はフレーム)にメッセージとデータを送信することができます。 appsink(例の28行目)を使用してGstreamerのパイプラインにメッセージ要素を投稿し、各フレームが渡されるメッセージを使用して、ストリームを個々のjpeg(または何でも)に分割してキャプチャするように設定することは可能ですフレームを分離して渡すことができるDBUS(bus_signal_watch)。このバージョンでは、Gstreamerループ用とGobjectループ用の2つの独立したスレッドで、示されているようにうまく動作するマルチスレッドが必要です。

関連する問題