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

如何在指定大小的Gtk窗口中嵌入GStreamer管道(树莓派低延迟)

解决方案:将GStreamer视频嵌入Gtk窗口并优化树莓派4低延迟播放

代码修改方案与解释

原代码的核心问题是使用了gtksink——该组件会自动创建独立窗口,导致双窗口现象。下面是修正后的代码,结合GstVideo.VideoOverlay接口将视频渲染到指定的Gtk.DrawingArea中:

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gst', '1.0')
gi.require_version('GstVideo', '1.0')
from gi.repository import Gtk, Gst, GstVideo

# 初始化GStreamer
Gst.init(None)

# 创建主Gtk窗口
win = Gtk.Window(title="Video Window")
win.connect("destroy", Gtk.main_quit)
win.set_default_size(600, 400)

# 创建承载视频的DrawingArea
drawingarea = Gtk.DrawingArea()
drawingarea.set_size_request(200, 200)
win.add(drawingarea)

# 构建GStreamer管道:替换gtksink为xvimagesink(树莓派低延迟可选kmssink)
pipeline = Gst.parse_launch("videotestsrc ! autovideoconvert ! xvimagesink")
# 树莓派低延迟版本:pipeline = Gst.parse_launch("videotestsrc ! autovideoconvert ! kmssink")

# 获取管道中的sink元素
sink = pipeline.get_by_name("xvimagesink0")  # 使用kmssink时改为"kmssink0"
# 验证sink是否支持VideoOverlay接口
if not GstVideo.VideoOverlay.interface_check(sink):
    print("该sink不支持视频嵌入接口")
    exit(1)

# 窗口映射完成后设置视频渲染目标
def on_drawingarea_realize(widget):
    # 获取DrawingArea的底层X11窗口ID
    window_handle = widget.get_window().get_xid()
    # 告诉GStreamer将视频渲染到这个窗口
    GstVideo.VideoOverlay.set_window_handle(sink, window_handle)

# 绑定realize信号:仅当组件被映射到屏幕后,窗口ID才有效
drawingarea.connect("realize", on_drawingarea_realize)

# 启动视频管道
pipeline.set_state(Gst.State.PLAYING)

# 显示所有组件并启动Gtk主循环
win.show_all()
Gtk.main()

关键修改点说明

  1. 导入GstVideo模块:必须导入才能使用VideoOverlay接口,该接口负责将视频绑定到指定窗口。
  2. 替换gtksink:xvimagesink/kmssink本身不创建窗口,仅负责视频渲染,需要通过VideoOverlay指定目标区域。
  3. 绑定realize信号:Gtk组件的窗口ID只有在组件被映射到屏幕(即realize信号触发)后才有效,此时设置渲染目标才不会出错。
  4. 设置窗口句柄:通过get_xid()获取DrawingArea的底层系统窗口ID,传递给VideoOverlay,让GStreamer将视频渲染到这个200x200的区域内。

树莓派4低延迟sink推荐

gtksink完全不推荐用于低延迟场景——它基于GTK软件绘图层,渲染路径长、延迟高,还会自动创建窗口。针对树莓派4,优先选择以下硬件加速sink:

  • kmssink(最推荐):
    直接通过DRM/KMS框架调用树莓派GPU,无需X11服务器,实现零额外开销的硬件加速,延迟极低。使用前需安装gstreamer1.0-plugins-bad包,且需将用户加入video组以获取设备权限:

    sudo usermod -aG video $USER
    

    管道示例:videotestsrc ! autovideoconvert ! kmssink

  • xvimagesink(X11环境下次选):
    利用Xv扩展实现硬件加速,延迟远低于gtksink,适合必须使用桌面环境的场景。需安装gstreamer1.0-plugins-good包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:14:57