基于PIR传感器通过omxplayer随机播放视频的实现需求
树莓派PIR运动触发随机视频播放方案
准备工作
先安装用于显示静态图片的工具feh,在终端执行以下命令:
sudo apt-get update && sudo apt-get install feh -y
完整代码实现
import RPi.GPIO as GPIO import time import os import random import subprocess # 配置参数 PIR_PIN = 23 VIDEO_FOLDER = "videos" STATIC_IMAGE = "/path/to/your/static/image.jpg" # 替换为你的静态图片绝对路径 DETECTION_INTERVAL = 30 # 运动检测间隔(单位:秒) # 全局变量:记录当前播放的视频进程 current_player = None def init_gpio(): """初始化GPIO引脚""" GPIO.setmode(GPIO.BCM) GPIO.setup(PIR_PIN, GPIO.IN) GPIO.setwarnings(False) # 关闭GPIO冗余警告 def stop_video(): """停止当前正在播放的视频进程""" global current_player if current_player is not None: current_player.terminate() current_player.wait() current_player = None def show_static_image(): """全屏显示指定静态图片""" stop_video() # feh参数说明:-F全屏、-Y隐藏鼠标、-Z自适应屏幕、-x禁用窗口装饰 subprocess.Popen(["feh", "-F", "-Y", "-Z", "-x", STATIC_IMAGE]) def play_random_video(): """随机播放videos文件夹内的视频文件""" global current_player stop_video() # 筛选文件夹内的常见视频格式文件 video_extensions = (".mp4", ".mov", ".avi", ".mkv") video_files = [f for f in os.listdir(VIDEO_FOLDER) if f.lower().endswith(video_extensions)] if not video_files: print("videos文件夹内未找到视频文件!") show_static_image() return # 随机选择一个视频 random_video = random.choice(video_files) video_path = os.path.join(VIDEO_FOLDER, random_video) # 启动omxplayer播放视频:-o hdmi输出到HDMI、-b黑屏背景、--no-osd隐藏控制条 current_player = subprocess.Popen([ "omxplayer", "-o", "hdmi", "-b", "--no-osd", video_path ]) print(f"正在播放: {random_video}") def main(): init_gpio() # 程序启动时默认显示静态图片 show_static_image() try: while True: # 获取PIR传感器状态 motion_detected = GPIO.input(PIR_PIN) if motion_detected: # 检测到运动:若当前无播放进程或视频已播放完毕,启动随机视频 if current_player is None or current_player.poll() is not None: play_random_video() else: # 无运动:停止视频并切换到静态图片 show_static_image() # 等待指定间隔后再次检测 time.sleep(DETECTION_INTERVAL) except KeyboardInterrupt: # 按下Ctrl+C时清理资源 stop_video() GPIO.cleanup() print("程序已退出") if __name__ == "__main__": main()
关键细节说明
- 进程管理:用
subprocess替代os.system,可以精准控制视频播放进程的启动与终止 - 检测逻辑:每30秒执行一次运动检测:
- 检测到运动:若当前无视频播放(或视频已播放完),自动随机选视频播放;正在播放的视频会继续播放
- 未检测到运动:立即停止视频,切换到静态图片
- 路径注意:
STATIC_IMAGE必须填写图片的绝对路径(例如/home/pi/desktop/static.jpg),避免路径错误 - 运行权限:操作GPIO需要sudo权限,终端运行脚本时执行:
sudo python3 your_script_name.py
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

