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

使用GStreamer的tee结合appsink录制流文件的正确管道语法

解决GStreamer Tee管道的语法错误问题

你在给GStreamer管道添加录制功能时遇到的语法错误很常见——tee的分支结构很容易写错,咱们一步步来修正:

错误原因分析

你的原管道有两个关键问题:

  • 分支结构错误:第一个分支的appsink后面直接接t.是语法错误,每个分支都应该从t.(tee的输出端)开始,分支之间要用空格分隔开,不能连在一起。
  • 冗余的Caps定义:udpsrc输出的已经是符合application/x-rtp...格式的流,不需要在每个分支里重复定义这个Caps,把它放在udpsrc后面即可,两个分支会自动继承这个格式。

另外,你原来的appsink分支还漏掉了video/x-raw,format=BGR的Caps(这是你之前正常运行的命令里有的),这个得加回去,不然appsink可能拿不到你需要的BGR格式帧。

正确的管道命令

先给你可以直接测试的gst-launch-1.0命令:

gst-launch-1.0.exe -vv udpsrc port=5000 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96 ! tee name=t \
t. ! queue ! rtph264depay ! decodebin ! videoconvert ! video/x-raw,format=BGR ! appsink name=sink \
t. ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=test.mp4

针对gst_parse_launch的代码适配

如果你是在C++代码里用gst_parse_launch,只需要把上面的命令整理成字符串即可(换行或空格分隔都可以,GStreamer会自动处理):

const gchar* pipeline_str = 
    "udpsrc port=5000 ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96 ! tee name=t "
    "t. ! queue ! rtph264depay ! decodebin ! videoconvert ! video/x-raw,format=BGR ! appsink name=sink "
    "t. ! queue ! rtph264depay ! h264parse ! mp4mux ! filesink location=test.mp4";
GstElement* pipeline = gst_parse_launch(pipeline_str, NULL);

额外注意事项

  • queue元素的必要性:每个分支加queue是必须的,它可以让两个分支的处理互不干扰,避免因为一个分支阻塞导致另一个分支卡住。
  • MP4文件完整性:如果你要停止录制,记得给mp4mux发送EOS事件,不然生成的MP4文件可能损坏无法播放。在代码里可以用gst_element_send_event(mp4mux, gst_event_new_eos())来实现。

内容的提问来源于stack exchange,提问作者p.deman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:08:13