python - Gstreamer 发送器和接收器在 Jetson TX1 上通过 UDP/TCP

标签 python gstreamer frames

我想在 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

我不知道“接收器”端需要添加哪些过滤器。 (我尝试了“videoparse”,但收到错误:“videoparse:未找到事件”) 另外,有没有办法使用 python 脚本捕获每个视频帧(图像)? 最终,我想使用 python 脚本捕获 jpeg 或 png 格式的每个帧。 我可以测试接收方是否可以从发送方(视频源)获取数据,但是仍然存在上述问题。

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()

最佳答案

要回答第一个问题,您需要包含另一个 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

注意,如果您从命令行运行 Gstreamer 管道,我会在 Gstreamer 管道中添加 -e,否则 Ctrl-C 将无法正确关闭流。 你的第二个问题是一个重要的练习。 https://github.com/markw63/pythongst/blob/master/README.md 是使用 appsink 执行此类工作的代码示例。 该代码从摄像头获取视频和音频,但可以轻松地从上面的 udpsrc 获取代码,连接到 appsink,然后在每个缓冲区(通常是帧)上发送消息和数据。 可以设置 Gstreamer,通过使用 appsink(示例的第 28 行)将任何流分割并捕获为单独的 jpeg(或其他内容),并在 Gstreamer 管道中发布消息元素,并在 Gstreamer 管道上传递每个帧的消息。 DBUS (bus_signal_watch) 然后可以隔离帧并传递它们。如图所示,该版本需要多线程才能正常工作,有两个独立的线程,一个用于 Gstreamer 循环,一个用于 Gobject 循环。

关于python - Gstreamer 发送器和接收器在 Jetson TX1 上通过 UDP/TCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40120808/

相关文章:

python - 如何在没有错误的情况下构建 py2exe?

c++ - GStreamer c++ - 在开始任何播放之前寻找

python - Qt : How to render 3D animation shapes over a camera video stream?

python - GStreamer错误 "assertion ' GST_IS_ELEMENT(链接元素时src )' failed"

javascript - 查找事件的父框架

javascript - HTML CSS - 如何使 iframe 内容适合 iframe

c# - 如何在 C# 中做类似 Delphi 的框架?

python - 倒序顺序数字

python - 计算字符串中有多少个单独的整数,Python 3

python - 从通信中分离输出