使用GStreamer结合FIFO实现摄像头视频传输播放遇错求助
解决GStreamer FIFO视频传输格式协商失败问题
错误原因
你遇到的not-negotiated (-4)错误,核心问题是发送端输出的是无格式标识的原始视频帧,接收端的filesrc仅能读取字节流,无法解析视频的格式、分辨率、帧率等关键信息,导致下游videoconvert无法完成格式协商,最终管道启动失败。
正确管道配置
以下提供两种可行方案,根据需求选择:
方案一:编码封装传输(推荐,兼容性强、低延迟)
这种方案将摄像头采集的视频编码为H.264并封装成TS流,适合跨设备/终端传输,且接收端无需手动指定格式:
- 创建FIFO(仅需执行一次):
mkfifo video1.ts
- 发送端终端执行(采集→编码→封装→写入FIFO):
gst-launch-1.0 -v v4l2src ! videoconvert ! x264enc tune=zerolatency ! mpegtsmux ! filesink location=video1.ts
x264enc tune=zerolatency:开启低延迟模式,适配实时视频传输场景mpegtsmux:将H.264编码数据封装为TS流,提供格式标识让接收端识别
- 接收端终端执行(读取TS流→解封装→解码→显示):
gst-launch-1.0 -v filesrc location=video1.ts ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
方案二:原始帧传输(无编码,延迟极低)
如果需要完全无压缩的原始视频传输,需手动指定视频格式、分辨率和帧率,确保发送端与接收端参数完全一致:
- 创建FIFO(仅需执行一次):
mkfifo video1.fifo
- 发送端终端执行(指定格式采集→写入FIFO):
gst-launch-1.0 -v v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=640,height=480,framerate=30/1 ! filesink location=video1.fifo
- 需根据你的摄像头实际支持的格式、分辨率调整参数,可通过
v4l2-ctl --list-formats-ext查看摄像头支持的参数
- 接收端终端执行(解析原始帧→转换→显示):
gst-launch-1.0 -v filesrc location=video1.fifo ! rawvideoparse format=YUY2 width=640 height=480 framerate=30/1 ! videoconvert ! autovideosink
- 此处参数必须与发送端完全匹配,否则仍会出现协商失败
内容的提问来源于stack exchange,提问作者KFUPM Electronics
相关产品推荐
相关产品推荐

