我想在Jetson TX1上使用Gstreamer通过UDP或TCP发送和接收视频帧。
貌似,我可以发送如下视频帧。
发件人:
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
更新:这看起来不错,但接收器上还是黑框。
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
我不知道需要在&#34; Receiver&#34;侧。 (我试过&#34; videoparse&#34;但是得到了错误:&#34; videoparse:找不到事件&#34;) 另外,有没有办法使用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()
答案 0 :(得分: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
这应该会给你一个有效的流。 要减少有效负载,请尝试:
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-raw视频。
另见这个答案.. 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行)将任何流拆分并捕获到单个jpeg(或其他)中,并在Gstreamer管道中发布消息元素,并在每个帧上传递消息DBUS(bus_signal_watch)然后可以隔离帧并传递它们。这个版本需要多线程才能正常工作,如图所示,有两个独立的线程,一个用于Gstreamer循环,另一个用于Gobject循环。