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

基于GStreamer、Qt与Weston在i.MX8 QXP上固定位置展示多路H264视频流

i.MX8 QXP + Weston + Qt 多路H264流展示问题解决方案

方案1(独立gst-launch调用waylandsink位置随机)修复方案

直接给waylandsink指定render-rectangle参数即可控制窗口在屏幕上的坐标和尺寸,不需要切换ivi-shell。参数格式为<x>,<y>,<width>,<height>,修改后的pipeline示例如下:

gst-launch-1.0 udpsrc port=50004 caps="application/x-rtp,media=(string)video, clock-rate=(int)90000, encodingname=(string)H264, payload=(int)96" ! queue ! rtpjitterbuffer latency=500 mode=slave do-lost=false ! rtph264depay ! h264parse ! v4l2h264dec ! imxvideoconvert_g2d ! waylandsink sync=false render-rectangle="100,100,640,480"

如果需要让视频窗口固定在Qt应用上层,可额外添加keep-aspect-ratio=false参数,同时通过weston的窗口规则配置对应gst进程的窗口层级,避免被其他应用遮挡。

方案2(imxcompositor_g2d偏移+黑底问题)修复方案

  • 坐标偏移是imxcompositor_g2d默认适配了桌面shell的面板预留区域,你可以给imxcompositor_g2d添加output-rectangle="0,0,<屏幕宽度>,<屏幕高度>"参数,强制指定合成后画面的输出范围,即可解决x=0时偏移到屏幕中间的问题。
  • 黑底问题可以通过开启waylandsink的alpha通道支持解决,修改后的pipeline需要在imxcompositor_g2d后添加caps指定带alpha的格式,同时给waylandsink设置background-color=0x00000000,示例如下:
gst-launch-1.0 -v imxcompositor_g2d name=comp 
sink_0::xpos=0 sink_0::ypos=0 sink_0::width=640 sink_0::height=480 
sink_1::xpos=0 sink_1::ypos=480 sink_1::width=640 sink_1::height=480 
output-rectangle="0,0,1920,1080" ! video/x-raw,format=RGBA ! waylandsink background-color=0x00000000 sync=false
videotestsrc ! comp.sink_0 
videotestsrc ! comp.sink_1

方案3(Qt qtvideosink延迟过高问题)修复方案

延迟高是默认MediaPlayer的缓冲配置和qtvideosink的内存拷贝导致的,你可以做两处修改:

  1. 放弃使用MediaPlayer,改用QGstVideoSink配合自定义的GStreamer pipeline直接渲染,跳过Qt MediaPlayer的多余缓冲逻辑。
  2. 在pipeline的imxvideoconvert_g2d后添加queue max-size-buffers=1 max-size-bytes=0 max-size-time=0,限制队列缓冲帧数,同时给qtvideosink设置sync=false,关闭时钟同步。
    修改后的QML代码示例如下:
import QtQuick 2.14
import QtMultimedia 5.14
import org.freedesktop.gstreamer.Qt 1.0

VideoOutput {
    id: videoOutput
    width:640
    height:400
    x: 100
    y: 100
    z: 1
    source: GstPipeline {
        pipeline: "udpsrc port=50004 caps=application/x-rtp,media=video,clock-rate=90000,encodingname=H264,payload=96 ! queue ! rtpjitterbuffer latency=500 mode=slave do-lost=false ! rtph264depay ! h264parse ! v4l2h264dec ! imxvideoconvert_g2d ! queue max-size-buffers=1 ! qtvideosink sync=false"
        autoPlay: true
    }
}

如果你的Qt版本没有预装GstPipeline组件,可以直接在C++层实现自定义pipeline,通过gst_app_sink把解码后的帧直接传给QQuickImageProvider渲染,内存零拷贝的情况下延迟可以做到和方案1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:02