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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:40:25