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

如何用Gstreamer在嵌入式Linux设备上循环播放视频?

嵌入式Linux下Gstreamer playbin实现视频无限循环播放

可以通过playbin实现,但loop=true参数失效通常是因为视频容器的demuxer(比如MP4对应的qtdemux)不支持原生循环,或者嵌入式设备上的GStreamer版本/后端对该参数的支持有限。以下是两种可行的实现方式:

方法1:Shell脚本循环重启playbin

这是最简单的命令行方式,当一次播放结束后自动重启playbin进程:

while true; do
    gst-launch-1.0 playbin uri=file:///home/weston/video.mp4
done

缺点是两次播放之间可能有短暂的黑屏或延迟,取决于设备性能。

方法2:监听EOS消息并手动Seek到开头(推荐)

这种方式无需重启进程,通过监听播放结束的EOS信号,调用seek命令回到视频起始位置,实现无缝循环。如果你的设备支持Python GStreamer绑定,可使用以下脚本:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GLib

Gst.init(None)

def on_bus_message(bus, message, loop):
    t = message.type
    if t == Gst.MessageType.EOS:
        # 播放结束,seek到0位置重新开始
        player.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
                    Gst.SeekType.SET, 0, Gst.SeekType.NONE, -1)
    elif t == Gst.MessageType.ERROR:
        err, debug = message.parse_error()
        print(f"Error: {err}, {debug}")
        loop.quit()
    return True

# 创建playbin实例
player = Gst.ElementFactory.make("playbin", "player")
player.set_property("uri", "file:///home/weston/video.mp4")

# 启动播放
player.set_state(Gst.State.PLAYING)

# 设置消息总线监听
loop = GLib.MainLoop()
bus = player.get_bus()
bus.add_watch(GLib.PRIORITY_DEFAULT, on_bus_message, loop)

try:
    loop.run()
except KeyboardInterrupt:
    pass

# 清理资源
player.set_state(Gst.State.NULL)

将代码保存为loop_play.py,执行python3 loop_play.py即可实现无缝循环。若设备无法运行Python,也可以用C语言编写相同逻辑,核心都是监听EOS消息后执行seek操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:01:14