2016-10-19 125 views
0

我想通過UDP或TCP使用Jetson TX1上的Gstreamer發送和接收視頻幀。通過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 

我不知道在「Receiver」端需要添加哪些過濾器。 (我試過「videoparse」,但出現錯誤:「videoparse:event not found」) 另外,有沒有辦法使用python腳本捕捉每個視頻幀(圖像)?最終,我想用python腳本以jpeg或png格式捕捉每個幀。 我可以測試一個接收者是否可以從發送者(視頻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

要回答的第一個問題,你需要包括其他的GStreamer元素rtpvrawpay到分組編碼成適合udpstreaming的有效載荷。由於rtpvrawpay不接受nvidia視頻,請更改大小寫以強制nvvidconv將其轉換爲正常視頻/ 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 

這應該會給你一個有效的流。 要depay有效載荷嘗試:

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 

請注意,我們不採取NVMM格式,只是標準的視頻/ X-RAW。如果 你

gst-inspect-1.0 nvoverlaysink 

你會看到它接受NVMM或標準的X-原始視頻。

也看到這個答案.. Stream H.264 video over rtp using gstreamer 而RidgeRun公司管道: https://developer.ridgerun.com/wiki/index.php?title=Gstreamer_pipelines_for_Tegra_X1

注意我加-e到您的Gstreamer管道,如果你在命令行中,否則按Ctrl-C不會關閉運行它們正確的流。 你的第二個問題是一個重要的練習。 https://github.com/markw63/pythongst/blob/master/README.md 是使用appsink執行此類作業的代碼示例。 這段代碼從攝像機獲取視頻和音頻,但可以很容易地從上面的udpsrc獲取代碼,連接到appsink,然後在每個緩衝區(通常是一個幀)上發送消息和數據。 可以設置Gstreamer通過使用appsink(示例的第28行)將任何流分割並捕獲到單獨的jpegs(或其他)中,並在Gstreamer管道中發佈消息元素,併爲每個幀傳遞消息DBUS(bus_signal_watch)可以隔離幀並傳遞它們。該版本需要多線程才能正常工作,具有兩個獨立的線程,一個用於Gstreamer循環,一個用於Gobject循環。