見出し画像

シャニマスのデジタルフォトフレームを作る② ~自動起動・タップして反応~

前回からの続き

前回のやり残しであった

  • 一定時間ごとに画像が切り替わる

  • タップしたら動画が再生される

を実装しました。

「ラズパイ デジタルサイネージ」とかで調べてみたところ、画像表示をpythonライブラリのpygameでコントロールして、動画はVLCで表示するのがよさそう。

サイトやchatGPTに相談しながら最終的に以下のようなコードになりました。

import sys
import pygame
import os
import subprocess
import random
from pygame.locals import QUIT, KEYDOWN, K_ESCAPE, MOUSEBUTTONDOWN
from datetime import datetime

pygame.init()
infoObject = pygame.display.Info()
SURFACE = pygame.display.set_mode((infoObject.current_w, infoObject.current_h), pygame.FULLSCREEN)
FPSCLOCK = pygame.time.Clock()

path = "画像を保存しているディレクトリ"  # Specify the path where the images and videos are stored
files = [f for f in os.listdir(path) if f.endswith('.png') and len(f) == 12]
random.shuffle(files)  # Shuffle the files randomly
interval = 60  # Interval to switch images (in seconds)

def play_video(video_path):
    # Use VLC to play the video. Ensure VLC is installed and accessible from the command line.
    subprocess.run(['cvlc', '-f', '--play-and-exit', '--no-video-title-show', '--video-on-top', video_path])

def main():
    pic_num = 0
    last_switch_time = datetime.now()  # Time when the last image switch occurred

    pygame.mouse.set_visible(False)

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
            elif event.type == MOUSEBUTTONDOWN:
                # If the screen is touched, play the corresponding video
                video_path = os.path.join(path, files[pic_num].replace('.png', '.mp4'))
                play_video(video_path)

        SURFACE.fill((0, 0, 0))

        # Check if the current time is interval seconds past the last switch time
        if (datetime.now() - last_switch_time).seconds >= interval:
            pic_num = (pic_num + 1) % len(files)
            last_switch_time = datetime.now()

        # Load and display the image, scaling it to fit the screen
        pic_path = os.path.join(path, files[pic_num])
        pic = pygame.image.load(pic_path)
        pic = pygame.transform.scale(pic, (infoObject.current_w, infoObject.current_h))  # Scale image to screen size
        SURFACE.blit(pic, (0, 0))  # Display the image

        pygame.display.update()
        FPSCLOCK.tick(30)  # Set FPS to refresh the screen

if __name__ == '__main__':
    main()

画像・動画ファイル名はリリースされたときの日付でYYYYMMDD.mp4/pngと設定

pygameの参考サイト

VLCのコマンド
https://so-zou.jp/software/tool/video/vlc/vlc-help.txt


これで無事にタップしたら動画が流れるデジタルフォトフレームが完成!

後はラズパイが起動したら自動でこのプログラムを立ち上げるだけ・・・
と思っていたら大苦戦

systemdで.serviceファイルを作って自動で起動しようとしたが、ラズパイのデスクトップ版PIXELではうまくいかず、CLIにするとVLCが動かず・・・(omxplayerとかを使えばよかったんでしょうかね?)

最終的には以下のサイトを参考に.desktopファイルを~/.config/autostart/に作りました

しかし!起動してもタップが反応せず悪戦苦闘
なんとか原因がVLCが起動できないということを突き止めました。
理由はGUI要素のあるアプリケーションは立ち上げから少し時間を空けてあげないとダメなのでした…

以下の.desktopファイルと

[Desktop Entry]
Type=Application
Name=My Python App
Exec=/home/pi/start_my_app.sh

以下のshファイルを作って

#!/bin/bash
# デスクトップ環境のロードを待つ
sleep 2
# Pythonスクリプトを実行
python3 /path/to/your/script.py

起動したら

初期設定は画面が反転、CLIを諦めた理由の一つ

自動に画像が切り替わって

かわいい~~~~

タップすると・・・

顔がよすぎる

ガチャ演出が流れる!

これだけでテンションMAX

1分おきに画像が切り替わる

このめぐるもやばい

と、一日でほぼほぼ目指していたものができました!

残りやりたいこと

  • 動画と画像を自動で取得しラズパイに送信する仕組み

  • 時間やカレンダーを表示して卓上時計みたいにする

  • 月ごとに合わせた画像で四季を感じる

  • カメラを使った機能

  • カードをかざすと曲が流れたり音に合わせて表示されて簡単なMVみたいにできると素敵…(そんなことできるのか?)


この記事が気に入ったらサポートをしてみませんか?