You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GStreamer分流RTSP视频流遇tcpserversink问题求助

GStreamer RTSP流分流:解决tcpserversink连接失败问题

问题背景

需要将IoT摄像头的RTSP流通过单个GStreamer进程分流,供多个异步录制进程使用(避免摄像头因多连接资源不足断开)。原捕获摄像头流的命令可正常工作:

gst-launch-1.0 -e rtspsrc location=rtsp://camera:554/data \
    ! rtph264depay \
    ! h264parse \
    ! mp4mux \
    ! filesink location=/tmp/data.mp4

但尝试用tcpserversink做服务端、tcpclientsrc做客户端时失败,客户端报错:

ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Internal data stream error.

原服务端命令:

gst-launch-1.0 -e rtspsrc location=rtsp://camera:554/data \
    tcpserversink port=29000

原客户端命令:

gst-launch-1.0 -e tcpclientsrc port=29000 \
    ! rtph264depay \
    ! h264parse \
    ! mp4mux \
    ! filesink location=/tmp/data.mp4

问题原因

  1. 管线语法错误:服务端命令中rtspsrc与tcpserversink之间缺少管道符!,GStreamer无法正确构建数据流管线。
  2. 流格式不兼容:rtspsrc输出的是RTP封装的H264流,直接传给tcpserversink后,客户端tcpclientsrc接收到的原始RTP包缺少会话参数(如payload类型、时钟速率),导致rtph264depay无法解析,触发数据流错误。
  3. 单客户端限制:默认tcpserversink仅支持一个客户端连接,无法满足多进程同时接入的需求。

解决方案

方案一:TCP传输H264裸流(支持多客户端)

服务端先解封装RTP、解析H264,再用tee分支结合multisocketsink(多客户端版TCP服务器)分发流:

服务端命令

gst-launch-1.0 -e rtspsrc location=rtsp://camera:554/data \
    ! rtph264depay \
    ! h264parse \
    ! tee name=t \
    t. ! queue ! multisocketsink port=29000 sync=false
  • multisocketsink支持同时接收多个TCP客户端连接;
  • queue用于隔离数据流分支,避免主管线阻塞;
  • sync=false取消时钟同步,适配多客户端异步录制场景。

客户端命令

gst-launch-1.0 -e tcpclientsrc host=localhost port=29000 \
    ! h264parse \
    ! mp4mux \
    ! filesink location=/tmp/data_$(date +%s).mp4

服务端已完成RTP解封装,客户端无需再执行rtph264depay,直接解析H264即可。

方案二:重新发布为RTSP流(兼容性更强)

如果客户端支持RTSP协议,推荐用gst-rtsp-server重新发布流,符合标准RTSP规范,且天然支持多客户端共享流:

服务端脚本(Python)

创建rtsp-relay.py:

import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GLib

class RTSPServer:
    def __init__(self):
        self.server = GstRtspServer.RTSPServer.new()
        self.server.set_service("8554")

        # 构建媒体工厂,将摄像头RTSP流转为可共享的RTSP流
        factory = GstRtspServer.RTSPMediaFactory.new()
        factory.set_launch("( rtspsrc location=rtsp://camera:554/data ! rtph264depay ! h264parse ! rtph264pay name=pay0 pt=96 )")
        factory.set_shared(True)  # 允许多客户端共享同一数据流

        # 挂载流路径
        mount_points = self.server.get_mount_points()
        mount_points.add_factory("/relay", factory)

        self.server.attach(None)

if __name__ == '__main__':
    Gst.init(None)
    server = RTSPServer()
    loop = GLib.MainLoop()
    loop.run()

运行脚本:

python3 rtsp-relay.py

客户端命令

gst-launch-1.0 -e rtspsrc location=rtsp://localhost:8554/relay \
    ! rtph264depay \
    ! h264parse \
    ! mp4mux \
    ! filesink location=/tmp/data.mp4

set_shared(True)确保所有客户端共享同一个摄像头连接,彻底避免摄像头因多连接资源耗尽断开。


内容的提问来源于stack exchange,提问作者radiofreemyourenji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:57:33