使用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
相关产品推荐
相关产品推荐

