使用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实现零间隙循环(专业数字标牌常用方案)
通过预加载下一个视频到后台图层,当前视频播放结束后直接切换图层显示,完全没有切换间隙,适配所有异构片源:
- 先安装依赖库:
pip install omxplayer-wrapper
- 运行脚本:
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
相关产品推荐
相关产品推荐

