Я пытаюсь управлять OMXplayer во время воспроизведения видео, используя скрипт Python.Я новичок в Dbus на Python, и, надеюсь, мне просто не хватает чего-то простого.
В конце концов, я хочу сделать это с датчиком движения, используя контакты GPIO, но сначала я просто пытаюсь получить контроль над плеером.Что мне нужно сделать, так это зациклить часть видео по истечении определенного времени, а затем перейти к «второй» части, когда переход прерывается.Я проверяю это с помощью ключевой записи.
Моя проблема заключается в том, что оператор if в коде не зацикливается, если не происходит прерывание от введенного ключа или любого другого сигнала.Любая клавиша вызовет прерывание, но я хочу, чтобы зависящий от времени оператор if в цикле срабатывал без ввода данных.Я надеюсь, что то, что я говорю, ясно из приведенного ниже кода, но если нет, пожалуйста, задайте любой вопрос, и я буду рад попытаться уточнить.
Я использую упаковщик OMXplayer Will Price: https://github.com/willprice/python-omxplayer-wrapper/
Мое оборудование - Raspberry Pi 3B +
Я рассматривал похожие вопросы, в том числе приведенные ниже, но не нашел ответа: Как открывать и закрывать omxplayer (Python / Raspberry Pi), покаВоспроизведение видео? https://www.raspberrypi.org/forums/viewtopic.php?p=533160
Я удалил ненужные части кода, так что это базовая функциональная версия.
from omxplayer.player import OMXPlayer #runs from the popcornmix omxplayer wrapper at https://github.com/popcornmix/omxplayerhttps://github.com/popcornmix/omxplayer and https://python-omxplayer-wrapper.readthedocs.io/en/latest/)
from pathlib import Path
import time
import RPi.GPIO as GPIO #for taking signal from GPIO
import subprocess
import logging
logging.basicConfig(level=logging.INFO)
VIDEO_PATH = Path("VIDEO.m4v")
player_log = logging.getLogger("Player 1")
player = OMXPlayer(VIDEO_PATH, dbus_name='org.mpris.MediaPlayer2.omxplayer1')
player.playEvent += lambda _: player_log.info("Play")
player.pauseEvent += lambda _: player_log.info("Pause")
player.stopEvent += lambda _: player_log.info("Stop")
positionEvent = 12
flyin = 3
flyaway = 15
'''
THE ERROR OCCURS IN THE BELOW FUNCTION!!!
the following function does not run each time
the 'while' loop below is playing, but does run
when there is a key pressed as an 'input'
I want to add a chck so that each time a certain
amount of time passes, the video jumps back
'''
def checktime():
currtime = player.position()
print("current time is " + str(currtime))
if(currtime > 3):
print("currtime is greater than 3")
try:
player.play()
print (" Ready")
while True:
'''
Below is the call for the function 'checktime'
This runs once when the video starts, and only
runs again when a key is entered.
I want this to run on a continuous loop
and call each time the video loops
'''
checktime()
key = input()
if key == 'd': #works perfectly
currtime = player.position()
player.seek(flyin-currtime)
print("player position is" + str(player.position()))
if key == 'a': #works perfectly
currtime = player.position()
player.seek(flyaway-currtime)
if key == 's': #works perfectly
player.play()
'''
in addition to the key inputs above, entering any key
and pressing return will run the checktime()
function. I understand that this is receiving an
input, therefore 'waking' the program up,
but I don't understand why the loop is not working
continuously
'''
# Wait for 10 milliseconds
time.sleep(.01)
except KeyboardInterrupt:
print (" Quit")
# Reset GPIO settings
GPIO.cleanup()
Видео управляется с помощью 's'Клавиши «A» и «D» в качестве входных данных, и это работает отлично.Однако функция 'checktime ()' не вызывается каждый раз, когда происходит цикл while.Я предполагаю, что это потому, что когда видео воспроизводится, оно не ищет ничего из программы Python, пока не получит другой ввод.
Я не уверен, правильно ли я использую DBus.В идеале я хотел использовать функцию seek_absolute для omxplayer-wrapper, но я не смог этого понять.Я работал над этим проектом и стал лучше понимать его с момента публикации предыдущего вопроса (см. Здесь: OMXplayer-wrapper и Python - переход к определенной точке в видео ), но я немного озадачен здесь.
Если кто-нибудь может помочь, я буду признателен за любые предложения!