Raspberry Pi + omxplayer-wraper - запуск видео файлов в нужном порядке по нажатию кнопок
📁 функция, python, пример, боты, ии, работа
Пытаюсь запускать видео файлы с Raspberry Pi из питона. Для этого использую omxplayer-wrapper.
nПытаюсь реализовать следующий алгоритм:
n- n
- В начале работы программы проигрывается файл a.mp4 n
- При нажатии кнопки 1, a.mp4 останавливается и включается b.mp4. Когда он заканчивается, снова включается a.mp4 n
- При нажатии кнопки 2, a.mp4 останавливается и включается c.mp4. Когда он заканчивается, снова включается a.mp4 n
Алгоритм работает, но наблюдаются следующие недостатки:
n- n
- После того как заканчивает проигрываться файл b.mp4 перед запуском a.mp4 виден рабочий стол (примерно 1 секунду) n
- После того как заканчивает проигрываться файл c.mp4 перед запуском a.mp4 виден рабочий стол уже больше времени (примерно 10-12 секунд) n
Как правильно осуществить эту задачу?
nПривожу набросок кода:
nfrom 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()nnUPD:
Вчера вечером проверил - вообще жесть.is_playing то работает, то не работает.
Там где не работает is_playing(), работает функция playback_status(), хотя она используется в is_playing()..quit() то убивает процесс, то нет.stop() то останавливает проигрыватель, то убивает процесс
Каша страшная..
Решил проблему грязным трюком:
1.запускаю видео
2. беру его продолжительность и вставляю в sleep()
3. после слипа убиваю видео
Если надо переключить видео, то переключение происходит в прерывании от кнопки.
Кажется работает... Но не красиво как-то... :(
Вижу 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()девайса нет, проверить не могу. Накидал по старой памяти, надеюсь будет работать.
Войдите чтобы оставить ответ