実現したいこと
現状:動画と動画が切り替わるときに、一度動画ウィンドウが閉じて次の動画に切り替わるので、その一度ウィンドウが閉じた時にデスクトップ(現在開いている画面)が見えてしまう。
→デスクトップを写らない様に改善したいです。
発生している問題・分からないこと
動画の再生プログラム実行中、動画と動画の切り替え時にデスクトップが写ってしまう
エラーメッセージ
error
1エラーメッセージは表示されていません。
該当のソースコード
Python
1import RPi.GPIO as GPIO 2import subprocess 3import time 4import threading 5 6SWITCH_GPIO = 13 7LED_GPIO = 0 8TOGGLE_GPIO = 20 9 10VIDEO_SELECT = "/home/pi/Desktop/AEDファイル/モード切替.mp4" 11VIDEO_ADULT = "/home/pi/Desktop/AEDファイル/小学生~大人.mp4" 12VIDEO_CHILD = "/home/pi/Desktop/AEDファイル/未就学児.mp4" 13VIDEO_3in1 = "/home/pi/Desktop/AEDファイル/3in1.mp4" 14 15GPIO.setwarnings(False) 16GPIO.setmode(GPIO.BCM) 17GPIO.setup(SWITCH_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP) 18GPIO.setup(LED_GPIO, GPIO.OUT) 19GPIO.setup(TOGGLE_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP) 20 21button_pressed = False 22button_process = None 23 24 25def kill_ffplay(): 26 try: 27 subprocess.run(["pkill", "ffplay"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 28 time.sleep(1) 29 except Exception as e: 30 print(f"Error killing ffplay: {e}") 31 32def play_video(video_path, blocking=True): 33 kill_ffplay() 34 if blocking: 35 subprocess.run([ 36 "ffplay", "-fs", "-noborder", "-autoexit", "-loglevel", "quiet", "-stats", "-analyzeduration", "1", "-probesize", "32", video_path], 37 stdout=subprocess.DEVNULL, 38 stderr=subprocess.DEVNULL 39 ) 40 else: 41 return subprocess.Popen([ 42 "ffplay", "-fs", "-noborder", "-autoexit", "-loglevel", "quiet", "-stats", "-analyzeduration", "1", "-probesize","32", video_path], 43 stdout=subprocess.DEVNULL, 44 stderr=subprocess.DEVNULL 45 ) 46 47def blink_led(): 48 while GPIO.input(SWITCH_GPIO) == GPIO.HIGH: 49 GPIO.output(LED_GPIO, GPIO.HIGH) 50 time.sleep(0.1) 51 GPIO.output(LED_GPIO, GPIO.LOW) 52 time.sleep(0.1) 53 54def monitor_button(): 55 global button_pressed 56 while not button_pressed: 57 if GPIO.input(SWITCH_GPIO) == GPIO.LOW: 58 button_pressed = True 59 GPIO.output(LED_GPIO, GPIO.LOW) 60 break 61 62 63try: 64 65 play_video(VIDEO_SELECT) 66 67 if GPIO.input(TOGGLE_GPIO) == GPIO.HIGH: 68 print("大人用動画") 69 button_process = play_video(VIDEO_ADULT, blocking=False) 70 else: 71 print("子供用動画") 72 button_process = play_video(VIDEO_CHILD, blocking=False) 73 74 button_pressed = False 75 76 time.sleep(55) 77 78 led_thread = threading.Thread(target=blink_led) 79 led_thread.start() 80 81 82 button_thread = threading.Thread(target=monitor_button) 83 button_thread.start() 84 85 led_thread.join() 86 87 if button_process is not None: 88 button_process.kill() 89 90 91 play_video(VIDEO_3in1) 92 93finally: 94 GPIO.cleanup() 95
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
pygameやopencv、vlc-pythonなどを使用して実行してみたのですが、変わりませんでした
補足
RaspberrypiOSを使用しています。Raspberrypi4modelB バージョンbullseye
ThonnyのIDEから実行しています。
「実行中のプログラムコードが写ってしまう」とはどの様に写っているのでしょうか?
記載されているソースコードが全て写っているのですか?
また、プログラムの実行方法はどのようにしていますか?
実行環境(ハードウェア構成)や実行方法がわかりません。
コメントありがとうございます。
自分が少し勘違いしていたのですが、ソースコードが見えてしまう訳ではなく、動画と動画が切り替る時に一度動画ウィンドウが閉じて次の動画に切り替わるので、その1度ウィンドウが閉じた時にデスクトップ(現在開いている画面)が見えてしまう、というとこでした。
環境はthonnyを使用しており、ledライトの着いているスイッチ、オンオフの出来るトグルスイッチをGPIOで繋げています。
ledライト GPIO29
ledライトスイッチ GPIO28
トグルスイッチ GPIO20
です。よろしくお願い致します。
質問内容としては、動画の再生ウィンドウを閉じずに別の動画の再生を開始したいということですね
その通りです。
説明不足で申し訳ありませんでした。
opencvでやるのがいいかなと思います。
opencvの動画再生方法についてはWeb上にたくさんあるので、そこは自分で調べてもらって、躓いた時に質問にその内容を追記してください。
補足としては、現状subprocessによるコマンド実行で再生、pkillによる停止を行っていますが、この場合再生プロセスがなくなり、ウィンドウが閉じてしまうのは避けられません。
opencvについても同様です。
そのためopencv-pythonの使い方を調べて、同じウィンドウで動画再生をするのがよいと思います。
@質問者 BEWDさん
> 自分が少し勘違いしていたのですが、ソースコードが見えてしまう訳ではなく、動画と動画が切り替る時に一度動画ウィンドウが閉じて次の動画に切り替わるので、その1度ウィンドウが閉じ> た時にデスクトップ(現在開いている画面)が見えてしまう、というとこでした。
現状ですと、本質問を眺めた人は少し??となる質問ですね。質問は編集できますので、コメント欄のみだけでなく質問の文を追記、修正されることをお勧めします。
> 環境はthonnyを使用しており、ledライトの着いているスイッチ、オンオフの出来るトグルスイッチをGPIOで繋げています。
とのことですが、Raspberry PiへはGUIでログインして、ThonnyのIDEからご提示のPythonスクリプトを手動で実行している、ということでしょうか。
返信ありがとうございます。
修正させていただきました。
killして再生してますが、
再生させてから(2つ起動している状態から古い方を)killしては、どうですか?
回答1件
あなたの回答
tips
プレビュー