Как транслировать видео онлайн, пока оно генерируется, и неудачный подход CGI - PullRequest
3 голосов
/ 08 марта 2011

У меня есть программа, которая может генерировать видео в режиме реального времени. Теперь я хотел бы транслировать это видео онлайн, пока оно генерируется. Кто-нибудь знает простой способ сделать это?

Я описываю подход CGI, который я пробовал, но он не сработал, но, пожалуйста, обратите внимание, что я открыт для всех вариантов, которые могли бы достичь моей цели. Мне просто интересно, если кто-нибудь знает, почему мой подход не работает и как я должен это исправить

Я установил, например, тип содержимого mpeg и периодически распечатывал порцию данных в файле mpeg. Но видео длится очень короткое время и прекращает потоковую передачу. Мой код примерно такой (в Python).

print "Content-type: video/mpeg"
print
f = open("test2.mpg")
while (True):
    st = f.read(1024*1024)
    sys.stdout.write(st)
    time.sleep(0.5)

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

print "Content-type: video/mpeg"
print
f = open("test2.mpg")
print f.read()

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Какой тип файла test2.mpg?

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

1 голос
/ 08 марта 2011

Возможно, вы достигли конца файла, и ваш цикл не работает, либо с EOFError, либо где-то сбоем.Если видео генерируется в режиме реального времени, если test2.mpg не является каналом FIFO (созданным с использованием mkfifo - в этом случае вы можете иметь только один ридер за раз) - чтение из канала может не вернуть никаких данных, и вашЦикл, скорее всего, будет работать намного быстрее, чем сохраняются ваши видеоданные.Таким образом, вам нужна стратегия для обработки EOF.

Кроме того, вы должны обязательно сбросить вывод - как после строки sys.stdout.write () в этой программе, так и после видеопотока вдругая программа.Поскольку у вашего цикла нет конечных условий и нет выходных данных, и вы можете никогда не закончить запись каких-либо данных, может случиться так, что после одной итерации цикла что-то не получится, и веб-сервер отбросит буферизованные данные.

Дополнительночтение постоянного размера 1 МБ за раз может вызвать проблемы с задержкой.Для лучшей задержки лучше использовать меньшие размеры;однако для лучшего качества и пропускной способности вы можете использовать большие размеры.Однако, латентность точка является спорным, если программа создания видео, ваш CGI скрипт или веб-сервер не все промывке через регулярные промежутки времени.

1006 * Я также предлагаю смотреть в «выбрать» или «опрос»/ epoll - любой из этих методов даст вам лучший контроль над чтением и может помочь вам решить проблему конца файла, спя, пока не станут доступны данные.Если вам нужно поспать (0,5), вам лучше использовать правильный выбор / опрос.
...