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

如何在文件夹内容变更时刷新Raspberry Pi幻灯片且不中断播放?

嘿,这个问题我之前折腾树莓派数码相框的时候也碰到过——总不能每次加新图都重启幻灯片吧?下面给你几个靠谱的方案,都能做到不中断当前播放就刷新队列:

方案1:用文件系统监听实现实时刷新

这个方法是最“聪明”的,能实时检测到文件夹里的新增/删除操作,一有变化就更新播放队列。

用Python的watchdog库(推荐)

如果你用Python写播放脚本,watchdog是个非常好用的库,专门用来监听文件系统变化。步骤如下:

  1. 先安装库:pip install watchdog
  2. 在你的播放脚本里加一段监听逻辑:
    • 初始化时读取一次文件夹里的所有图片,生成播放列表
    • 启动一个后台线程,监听文件夹的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来监听文件夹:

  1. 先安装工具:sudo apt install inotify-tools
  2. 写个脚本,后台监听文件夹,当有新文件时触发播放列表刷新(配合方案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信号就行。

  1. 先启动feh幻灯片:
    feh --slideshow --fullscreen --randomize --auto-zoom /path/to/images
  2. 当你添加新图片后,先找到feh的进程ID:
    pgrep feh
  3. 发送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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:15