Воспроизведение различных видеофайлов в зависимости от значения переменной во время выполнения - PullRequest
1 голос
/ 26 февраля 2012

У меня есть 4 видеофайла (разные сцены фильма).

Есть начальная сцена, которая будет проигрываться, когда я запускаю плеер. И прежде чем эта сцена закончится, скажем, видеопроигрыватель считывает значение int (0-100) из внешнего файла (все происходит во время выполнения), и в зависимости от этого значения int он должен определить, какая сцена будет воспроизводиться следующей.

псевдо-пример:

        if (x > 0 && x < 30)
           videoSource = scene2

        else if (x >= 30 && x < 60)
           videoSource = scene3

        else if (x >= 60 && x <= 100)
            videoSource = scene 4

Как я могу изменить источники видео во время выполнения, в зависимости от этой переменной?

Меня не волнует формат видеофайла (Avi, mp4 ...), все будет хорошо.

Я не знаю, как решить эту проблему. Я искал что-то, что может достичь этого, например pyglet или GStreamer , но я не нашел четкого решения.

РЕДАКТИРОВАТЬ: у меня есть базовый проигрыватель и видеоплеер с pyglet, и я смог воспроизвести видео без зависимости от переменной, используя этот код:

import pyglet
vidPath="sample.mpg"
window = pyglet.window.Window()
player = pyglet.media.Player()
source = pyglet.media.StreamingSource()
MediaLoad = pyglet.media.load(vidPath)

player.queue(MediaLoad)
player.play()

@window.event
def on_draw():
  window.clear()
  if player.source and player.source.video_format:
    player.get_texture().blit(0,0)

pyglet.app.run()

Как бы я поступил по этому поводу? Руководство в правильном направлении и / или некоторые примеры кода будут высоко оценены.

Заранее спасибо.

1 Ответ

2 голосов
/ 27 февраля 2012

Ответ пересмотрен на основе комментариев

Если ваша цель - постоянно читать файл, который получает записи из вывода другого процесса, у вас есть пара аспектов, которые необходимо решить...

  1. Вам либо нужно периодически читать файл, который постоянно перезаписывается, либо вам нужно сопоставить вывод файла, к которому добавляются, с новыми значениями.
  2. Ваш скрипт в настоящее время блокируется, когда вы запускаете цикл событий pyglet, поэтому эта проверка файла должна быть в другом потоке, а затем вам нужно будет сообщить событие обновления.

Я не могу полностью прокомментировать шаг 2, потому что я никогда не использовал pyglet и не знаю, как он использует события или сигналы.Но я могу по крайней мере предложить половину этого с потоком.

Вот супер базовый пример использования потока, чтобы прочитать файл и сообщить, когда строка найдена:

import time
from threading import Thread

class Monitor(object):

    def __init__(self):
        self._stop = False

    def run(self, inputFile, secs=3):
        self._stop = False

        with open(inputFile) as monitor:

            while True:
                line = monitor.readline().strip()
                if line.isdigit():

                    # this is where you would notify somehow
                    print int(line)

                time.sleep(secs)

                if self._stop:
                    return

    def stop(self):
        self._stop = True


if __name__ == "__main__":

    inputFile = "write.txt"

    monitor = Monitor()

    monitorThread = Thread(target=monitor.run, args=(inputFile, 1))
    monitorThread.start()

    try:
        while True:
            time.sleep(.25)

    except:
        monitor.stop()

Цикл сна в конце кода - это просто способ эмулировать ваш цикл и блок событий.

Вот тест, чтобы показать, как это будет работать.Сначала я открываю оболочку Python и открываю новый файл:

>>> f = open("write.txt", 'w+', 10)

Затем вы можете запустить этот скрипт.И обратно в оболочку вы можете начать писать строки:

>>> f.write('50\n'); f.flush()

В вашем терминальном скрипте вы увидите, что он читает и печатает строки.

Другой способ будетбудь то, если ваш процесс, который пишет в этот файл, постоянно перезаписывает его, вы бы просто перечитали файл, установив monitor.seek(0) и вызвав readline ().

Опять же, это действительно простой пример для начала,Я уверен, что есть более продвинутые способы решения этой проблемы.Следующим шагом будет выяснить, как вы можете подать сигнал в цикл событий pyglet для вызова метода, который изменит ваш источник видео.

Обновление

Вы должны просмотреть этораздел документации pyglet о том, как создать свой собственный диспетчер событий: http://pyglet.org/doc/programming_guide/creating_your_own_event_dispatcher.html

Опять же, без особых знаний о pyglet, вот как это может выглядеть:

class VideoNotifier(pyglet.event.EventDispatcher):

    def updateIndex(self, value):
        self.dispatch_events('on_update_index', value)

VideoNotifier.register_event('on_update_index')


videoNotifier = VideoNotifier()

@videoNotifier.event
def on_update_index(newIndex):
    # thread has notified of an update
    # Change the video here
    pass

И дляваш класс потока, вы должны передать экземпляр диспетчера и использовать событие updateIndex () для уведомления:

class Monitor(object):

    def __init__(self, dispatcher):
        self._stop = False
        self._dispatcher = dispatcher

    def run(self, inputFile, secs=3):
        ...
        ...

        # should notify video of new value
        line = int(line_from_file)
        self._dispatcher.updateIndex(line)

        ...
        ...

Надеюсь, что вы начали!

...