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

使用omxplayer实现目录内视频文件无缝循环播放的技术咨询

实现方案

数字标牌类产品的视频循环核心逻辑为预加载下一个视频实例+多图层切换,完全不需要提前拼接全部视频,天然适配不同编码、帧率、分辨率的片源,也没有前置处理的耗时开销。

方案1:Shell脚本快速实现(适合轻量需求)

该方案可实现接近无缝的播放效果,部署成本极低:

#!/bin/bash
# 替换为你的视频存放目录路径
VIDEO_DIR="/opt/videos"
# 自动扫描目录下的常见格式视频,按文件名排序生成播放列表
PLAYLIST=($(find "$VIDEO_DIR" -type f \( -iname "*.mp4" -o -iname "*.mkv" -o -iname "*.avi" \) | sort))

if [ ${#PLAYLIST[@]} -eq 0 ]; then
    echo "未找到可播放的视频文件"
    exit 1
fi

while true; do
    for video in "${PLAYLIST[@]}"; do
        # 关闭OSD显示,消除播放切换时的黑场间隙
        omxplayer --no-osd --blank "$video" > /dev/null 2>&1
    done
done

使用前给脚本加执行权限:chmod +x play_loop.sh,直接运行即可。

方案2:Python实现零间隙循环(专业数字标牌常用方案)

通过预加载下一个视频到后台图层,当前视频播放结束后直接切换图层显示,完全没有切换间隙,适配所有异构片源:

  1. 先安装依赖库:
pip install omxplayer-wrapper
  1. 运行脚本:
from omxplayer.player import OMXPlayer
from pathlib import Path
import time

# 替换为你的视频存放目录路径
VIDEO_DIR = Path("/opt/videos")
# 生成按文件名排序的播放列表,可自行添加支持的格式后缀
PLAYLIST = sorted([
    f for f in VIDEO_DIR.iterdir() 
    if f.suffix.lower() in ('.mp4', '.mkv', '.avi', '.mov')
])

if not PLAYLIST:
    print("未找到可播放的视频文件")
    exit()

current_layer = 20
back_layer = 10
current_index = 0

# 启动第一个视频播放
current_player = OMXPlayer(
    PLAYLIST[current_index],
    args=['--no-osd', '--layer', str(current_layer)],
    dbus_name='org.mpris.MediaPlayer2.omxplayer1'
)

while True:
    # 计算当前视频剩余播放时长,提前2秒预加载下一个视频到后台图层
    remaining_time = current_player.duration() - current_player.position()
    if remaining_time < 2:
        next_index = (current_index + 1) % len(PLAYLIST)
        # 预加载下一个视频到后台图层
        next_player = OMXPlayer(
            PLAYLIST[next_index],
            args=['--no-osd', '--layer', str(back_layer)],
            dbus_name='org.mpris.MediaPlayer2.omxplayer2'
        )
        # 等待当前视频播放完成
        while current_player.position() < current_player.duration():
            time.sleep(0.1)
        # 销毁当前播放实例,后台预加载的视频自动显示到前台
        current_player.quit()
        # 交换图层与实例,准备下一轮循环
        current_player = next_player
        current_layer, back_layer = back_layer, current_layer
        current_index = next_index

注意事项

  • 若运行时出现权限报错,将当前用户加入video组即可解决:sudo usermod -aG video $USER
  • 低性能设备可将预加载提前时间从2秒调整为3秒,避免预加载不及时导致的间隙

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:54:04