如何用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
相关产品推荐
相关产品推荐

