gstreamer - Gstreamer:udpsink/udpsrc 与 tcpserversink/tcpclientsrc
问题描述
我对 gstreamer 非常陌生,但经过大量研究后,我现在设法创建自己的工作管道,通过网络将网络摄像头从 Raspberry PI Zero 通过 UDP 传输流式传输到 PC。我对我的进步感到高兴!:)
但我正在努力创建一个 TCP 传输......
此管道在 UDP 上完美运行:(注意:使用测试视频源和 JPEG 编码进行了简化):
Server UDP (192.168.2.1):
gst-launch-1.0 videotestsrc is-live=true ! jpegenc ! rtpjpegpay ! udpsink host=192.168.2.13 port=7001
Client UDP (192.168.2.13):
gst-launch-1.0 udpsrc port=7001 ! application/x-rtp,encoding-name=JPEG ! rtpjpegdepay ! jpegdec ! autovideosink
...但是当我使用具有完全相同元素的 TCP 接收器/源时,我只收到错误。
使用tcpserversink和tcpclientsrc修改的管道:
Server TCP (192.168.2.1):
gst-launch-1.0 videotestsrc is-live=true ! jpegenc ! rtpjpegpay ! tcpserversink port=7001
Client TCP (192.168.2.13):
gst-launch-1.0 tcpclientsrc host=192.168.2.1 port=7001 ! application/x-rtp,encoding-name=JPEG ! rtpjpegdepay ! jpegdec ! autovideosink
尝试 1:tcpserversink 端口=7001
ERROR: Failed to connect to host '192.168.2.1:7001': No connection could be made because the target machine actively refused it.
尝试 2:tcpserversink 主机=localhost 端口=7001
ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Could not open resource for reading.
尝试 3:tcpserversink 主机=127.0.0.1 端口=7001
ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Could not open resource for reading.
尝试 4:tcpserversink 主机=192.168.2.1 端口=7001
ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Internal data stream error.
尝试 5:tcpserversink 主机=0.0.0.0 端口=7001
ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Internal data stream error.
我想我应该能够在不破坏管道的情况下替换 src 和 sink 元素,所以我一定是遗漏了一些东西。
如果您能对此有所了解,我将不胜感激。
解决方案
您可以(至少)使用两种方法之一来解决它。第一个是在您的媒体类型的 rtp 加载器之后添加 rtpstreampay 元素。
服务器:
gst-launch-1.0 videotestsrc is-live=true \
! jpegenc \
! rtpjpegpay \
! rtpstreampay \
! tcpserversink port=7001
客户:
gst-launch-1.0 tcpclientsrc port=7001 \
! application/x-rtp-stream,encoding-name=JPEG \
! rtpstreamdepay \
! rtpjpegdepay \
! jpegdec \
! autovideosink
第二种方法是使用多路复用器而不是 rtp 加载器,类似 matroskamux 的东西非常通用。
服务器:
gst-launch-1.0 videotestsrc is-live=true \
! jpegenc \
! matroskamux \
! tcpserversink port=7001
客户:
gst-launch-1.0 tcpclientsrc port=7001 \
! matroskademux \
! jpegdec \
! autovideosink
如果您想要进行客户端/服务器 rtp 连接,您可能还想查看 GstRtspServer。像这样的简单 Python 脚本将充当服务器。
rtspserver.py
import gi
gi.require_version('Gst','1.0')
gi.require_version('GstRtspServer','1.0')
from gi.repository import Gst, GObject, GstRtspServer
Gst.init(None)
mainloop = GObject.MainLoop()
server = GstRtspServer.RTSPServer()
factory = GstRtspServer.RTSPMediaFactory()
factory.set_launch((
'videotestsrc is-live=true '
'! jpegenc '
'! rtpjpegpay name=pay0 pt=26'
))
# allow multiple connections
factory.set_shared(True)
mounts = server.get_mount_points()
mounts.add_factory('/live', factory)
server.attach(None)
mainloop.run()
您可以使用这样的管道来查看输出。
gst-launch-1.0 \
rtspsrc location=rtsp://localhost:8554/live latency=100 \
! rtpjpegdepay \
! jpegdec \
! autovideosink
推荐阅读
- node.js - @import 'X' 媒体查询表达式必须以 '(' 开头,这对于带有 gatsby 的 sass 文件没有意义
- ios - 将 ipa 上传到应用程序加载器时出错
- javascript - 是否存在像 javascript es6 字符串模板文字这样的 Go 字符串模板?
- asp.net - 如何在 IIS 10 和 ASP Clasic 上添加 Etag 和 Last Modified Header?
- flutter - 当我使用扩展时隐藏类?
- c# - 如何从 EF Core 代码优先方法创建存储过程?
- javascript - 将库导入 laravel
- typescript - 环境上下文中的“const”初始值设定项必须是字符串或数字文字
- security - 禁用赛普拉斯测试的网络安全会保留状态 - 如何强制清理?
- php - 使用 AJAX 将与按钮无关的数据发送到模态