аватар question@mail.ru · 01.01.1970 03:00

Raspberry Pi + omxplayer-wraper - запуск видео файлов в нужном порядке по нажатию кнопок

Пытаюсь запускать видео файлы с Raspberry Pi из питона. Для этого использую omxplayer-wrapper.

n

Пытаюсь реализовать следующий алгоритм:

n
    n
  1. В начале работы программы проигрывается файл a.mp4
  2. n
  3. При нажатии кнопки 1, a.mp4 останавливается и включается b.mp4. Когда он заканчивается, снова включается a.mp4
  4. n
  5. При нажатии кнопки 2, a.mp4 останавливается и включается c.mp4. Когда он заканчивается, снова включается a.mp4
  6. n
n

Алгоритм работает, но наблюдаются следующие недостатки:

n
    n
  1. После того как заканчивает проигрываться файл b.mp4 перед запуском a.mp4 виден рабочий стол (примерно 1 секунду)
  2. n
  3. После того как заканчивает проигрываться файл c.mp4 перед запуском a.mp4 виден рабочий стол уже больше времени (примерно 10-12 секунд)
  4. n
n

Как правильно осуществить эту задачу?

n

Привожу набросок кода:

n
from omxplayer import OMXPlayefrom time import sleepnplayerA = OMXPlayer('path/to/a.mp4', args=['-b', '--loop'])nplayerB = OMXPlayer('path/to/b.mp4', args=['-b'])nplayerC = OMXPlayer('path/to/c.mp4', args=['-b'])nplayerA.play()nwhile True:n    if Button1PressedFlag==True: #set in interruptn        Button1PressedFlag=Falsen        playerA.pause()n        playerB.play()n        while playerB.is_playing():n            sleep(0.2)n        playerB.quit()n        playerA.play()n    if Button2PressedFlag==True: #set in interruptn        Button2PressedFlag=Falsen        playerA.pause()n        playerC.play()n        while playerC.is_playing():n            sleep(0.2)n        playerC.quit()n        playerA.play()n
n

UPD:
Вчера вечером проверил - вообще жесть.
is_playing то работает, то не работает.
Там где не работает is_playing(), работает функция playback_status(), хотя она используется в is_playing()..
quit() то убивает процесс, то нет.
stop() то останавливает проигрыватель, то убивает процесс
Каша страшная..
Решил проблему грязным трюком:
1.запускаю видео
2. беру его продолжительность и вставляю в sleep()
3. после слипа убиваю видео
Если надо переключить видео, то переключение происходит в прерывании от кнопки.
Кажется работает... Но не красиво как-то... :(

аватар answer@mail.ru · 01.01.1970 03:00

Вижу 2 варианта решения проблемы. Или использовать pause/load

from omxplayer import OMXPlayerfrom gpiozero import Buttonplayer = OMXPlayer('path/to/a.mp4', args=['-b', '--loop'])button1 = Button(1)button2 = Button(2)player.play()while True:    if button1.is_pressed:        player.pause()        player.load('path/to/b.mp4')        player.play()    elif button2.is_pressed:        player.pause()        player.load('path/to/c.mp4')        player.play()

Или использовать прелоад

from omxplayer import OMXPlayerfrom gpiozero import Buttonfrom threading import ThreadplayerA = OMXPlayer('path/to/a.mp4', args=['-b', '--loop'])playerB = OMXPlayer('path/to/b.mp4', args=['-b'])playerC = OMXPlayer('path/to/c.mp4', args=['-b'])current_player = playerAnext_player = playerBdef load_next_video(player, video_path):    player.load(video_path)load_thread = Thread(target=load_next_video, args=(next_player, 'path/to/b.mp4'))load_thread.start()button1 = Button(1)button2 = Button(2)current_player.play()while True:    if button1.is_pressed:        current_player.pause()        next_player.pause()        current_player, next_player = next_player, current_player        load_thread = Thread(target=load_next_video, args=(next_player, 'path/to/b.mp4'))        load_thread.start()        current_player.play()    elif button2.is_pressed:        current_player.pause()        next_player.pause()        current_player, next_player = next_player, current_player        load_thread = Thread(target=load_next_video, args=(next_player, 'path/to/c.mp4'))        load_thread.start()        current_player.play()

девайса нет, проверить не могу. Накидал по старой памяти, надеюсь будет работать.

Последние

Похожие