如何在文件夹内容变更时刷新Raspberry Pi幻灯片且不中断播放?
嘿,这个问题我之前折腾树莓派数码相框的时候也碰到过——总不能每次加新图都重启幻灯片吧?下面给你几个靠谱的方案,都能做到不中断当前播放就刷新队列:
方案1:用文件系统监听实现实时刷新
这个方法是最“聪明”的,能实时检测到文件夹里的新增/删除操作,一有变化就更新播放队列。
用Python的watchdog库(推荐)
如果你用Python写播放脚本,watchdog是个非常好用的库,专门用来监听文件系统变化。步骤如下:
- 先安装库:
pip install watchdog - 在你的播放脚本里加一段监听逻辑:
- 初始化时读取一次文件夹里的所有图片,生成播放列表
- 启动一个后台线程,监听文件夹的
created事件(也就是新文件被添加) - 当检测到新图片时,把它追加到播放列表里(记得过滤掉临时文件,比如上传时的
.part文件) - 播放循环里正常读取列表,下一次切换图片时就会包含新图了
举个简单的代码片段例子:
import os import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import glob image_extensions = ['.jpg', '.jpeg', '.png', '.gif'] image_folder = '/path/to/your/images' image_list = [] class ImageHandler(FileSystemEventHandler): def on_created(self, event): if not event.is_directory: ext = os.path.splitext(event.src_path)[1].lower() if ext in image_extensions: # 等文件完全写入再添加,避免读取不完整的图片 time.sleep(1) if event.src_path not in image_list: image_list.append(event.src_path) def load_initial_images(): global image_list for ext in image_extensions: image_list.extend(glob.glob(f"{image_folder}/*{ext}")) # 去重+排序,避免重复添加 image_list = list(set(image_list)) image_list.sort() # 初始化图片列表 load_initial_images() # 启动监听线程 event_handler = ImageHandler() observer = Observer() observer.schedule(event_handler, image_folder, recursive=False) observer.start() # 播放循环(这里用伪代码,你可以替换成实际的播放逻辑,比如用PIL或pygame) try: while True: for img in image_list: print(f"播放图片: {img}") time.sleep(5) # 每张图显示5秒 except KeyboardInterrupt: observer.stop() observer.join()
用shell脚本+inotifywait
如果你用shell脚本播放(比如用feh),可以用inotifywait来监听文件夹:
- 先安装工具:
sudo apt install inotify-tools - 写个脚本,后台监听文件夹,当有新文件时触发播放列表刷新(配合方案3的信号法效果更好)
方案2:定时扫描文件夹(简单易上手)
如果觉得监听太复杂,定时扫描绝对是懒人的福音——不用搞后台线程,每次切换图片前重新读取一次文件夹内容就行,完全不影响当前播放。
比如用Python的话,修改播放循环:
import glob import time image_extensions = ['.jpg', '.jpeg', '.png', '.gif'] image_folder = '/path/to/your/images' def get_image_list(): image_list = [] for ext in image_extensions: image_list.extend(glob.glob(f"{image_folder}/*{ext}")) return list(set(image_list)) # 去重 # 播放循环 while True: current_images = get_image_list() for img in current_images: print(f"播放图片: {img}") time.sleep(5) # 每次播放完一张就重新获取列表,下一张就可能包含新图 current_images = get_image_list()
这个逻辑很简单:每次播放完一张图就重新拉取最新的图片列表,新加入的图片会在下一次切换时被播放。
方案3:给现成播放工具发信号(适合用feh/mpv的情况)
如果你用的是现成的幻灯片工具比如feh,其实它本身就支持不中断播放刷新列表——只要给它发一个SIGHUP信号就行。
- 先启动feh幻灯片:
feh --slideshow --fullscreen --randomize --auto-zoom /path/to/images - 当你添加新图片后,先找到feh的进程ID:
pgrep feh - 发送HUP信号让它重新加载列表:
kill -HUP <feh_pid>
这样feh会在不中断当前播放的前提下,重新扫描文件夹,新图片会自动加入播放队列。
你甚至可以把这个逻辑写成一个自动脚本,结合inotifywait,一检测到文件夹有新文件就自动发信号:
#!/bin/bash IMAGE_FOLDER="/path/to/images" FEH_PID=$(pgrep feh) inotifywait -m -e create --format '%f' "$IMAGE_FOLDER" | while read FILE; do # 过滤图片格式 if [[ "$FILE" =~ \.(jpg|jpeg|png|gif)$ ]]; then # 等文件完全写入 sleep 1 kill -HUP "$FEH_PID" echo "刷新播放队列,新增图片: $FILE" fi done
把这个脚本后台运行,以后加新图就完全不用手动操作了!
内容的提问来源于stack exchange,提问作者foobar443
相关产品推荐
相关产品推荐

