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

使用GStreamer结合FIFO实现摄像头视频传输播放遇错求助

解决GStreamer FIFO视频传输格式协商失败问题

错误原因

你遇到的not-negotiated (-4)错误,核心问题是发送端输出的是无格式标识的原始视频帧,接收端的filesrc仅能读取字节流,无法解析视频的格式、分辨率、帧率等关键信息,导致下游videoconvert无法完成格式协商,最终管道启动失败。

正确管道配置

以下提供两种可行方案,根据需求选择:

方案一:编码封装传输(推荐,兼容性强、低延迟)

这种方案将摄像头采集的视频编码为H.264并封装成TS流,适合跨设备/终端传输,且接收端无需手动指定格式:

  1. 创建FIFO(仅需执行一次):
mkfifo video1.ts
  1. 发送端终端执行(采集→编码→封装→写入FIFO):
gst-launch-1.0 -v v4l2src ! videoconvert ! x264enc tune=zerolatency ! mpegtsmux ! filesink location=video1.ts
  • x264enc tune=zerolatency:开启低延迟模式,适配实时视频传输场景
  • mpegtsmux:将H.264编码数据封装为TS流,提供格式标识让接收端识别
  1. 接收端终端执行(读取TS流→解封装→解码→显示):
gst-launch-1.0 -v filesrc location=video1.ts ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! autovideosink

方案二:原始帧传输(无编码,延迟极低)

如果需要完全无压缩的原始视频传输,需手动指定视频格式、分辨率和帧率,确保发送端与接收端参数完全一致:

  1. 创建FIFO(仅需执行一次):
mkfifo video1.fifo
  1. 发送端终端执行(指定格式采集→写入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查看摄像头支持的参数
  1. 接收端终端执行(解析原始帧→转换→显示):
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:20:34