Можно ли управлять OMXplayer на основе времени в Python? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь управлять 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 - переход к определенной точке в видео ), но я немного озадачен здесь.

Если кто-нибудь может помочь, я буду признателен за любые предложения!

...