Как отправить видеофайлы, которые транскодируются, в режиме реального времени с помощью Python Twisted.web?

Я создаю видеостример, используя Python Twisted.web с обратными вызовами для ffmpeg.

Мне интересно, поскольку я отправляю файлы с помощью «return file.read()», могут возникнуть проблемы с отправкой перекодированного вывода, поскольку он не будет доступен для чтения полностью? Я слишком много думаю об этом, и все это управляется низкоуровневым кодом управления Twisted.web, или мне нужно переосмыслить свой метод?

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

Спасибо


person monkeymad2    schedule 30.11.2012    source источник
comment
Когда вы говорите return file.read(), является ли файл файловым объектом, объектом Popen или чем-то еще? Если это объект Popen, вам следует рассмотреть возможность использования reactor.spawnProcess() скрученного, чтобы получить протокол, который вы можете подключить к обработчику http для выполнения потокового чтения.   -  person fmoo    schedule 02.12.2012
comment
Файл - это файловый объект, но я посмотрю на Popen и spawnProcess. Благодарность   -  person monkeymad2    schedule 02.12.2012


Ответы (1)


1) Могу ли я использовать file.read() в Twisted?

Короткий ответ - нет".

Если вы не сделали кучу других относительно сложных вещей, таких как установка O_NONBLOCK для fd или явно делегировали этот запрос отдельному потоку, file.read() является блокирующим вызовом, который будет считывать весь файл в память перед его возвратом.

Пока эти данные считываются с диска синхронно, реактор Twisted не сможет вызывать какие-либо обратные вызовы или читать или записывать какие-либо доступные данные на любых fds, что приводит к полной остановке любых других ожидающих запросов или потоковой передачи, пока ваш файл читается. в память.

Более того, если исходный том файла сильно загружен и/или файлов много, даже вызовы open() для получения файловых объектов могут блокироваться на значительное время. Неблокирующего открытия нет, поэтому, если вам нужен файловый объект, вы должны использовать reactor.deferToThread(), если вам нужно получить обычный файловый объект в скрученном виде.

Итак, вот что вам нужно сделать:

Для чтения файлов непосредственно из файловой системы с помощью twisted вам следует заглянуть в файлы twisted.web.server.Site и twisted.web.static.File. По ним есть интересное руководство здесь . Эти вызовы не только будут передавать содержимое файла с диска, но также будут поддерживать дополнительные функции HTTP для статических файлов, такие как запросы диапазона HTTP.

2) Как я могу поддержать людей, перескакивающих вперед к частям видео, которые для них не буферизованы?

Это обычно называют очисткой, и в основном существует два вида очистки: очистка HTML5 и очистка на основе времени.

Первый (очистка HTML5) — это просто причудливый способ сказать «запросы диапазона HTTP» и поддерживается собственными браузерами и плагинами, такими как Safari Mobile, Quicktime, mplayer и всеми браузерами, которые реализуют тег html5. Это подтверждается twisted.web.static.File, о котором я упоминал в своем ответе на первый вопрос.

Последний (очистка на основе времени) является устаревшим способом поддержки очистки. По сути, это соглашение между пользовательским проигрывателем (например, jwplayer или OSMF) и сервером, которое позволяет проигрывателю запрашивать видео, начинающееся с временного смещения, указанного определенным параметром запроса.

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

person fmoo    schedule 02.12.2012
comment
Блестяще, спасибо. Я бы не столкнулся с какой-либо блокировкой, так как это 1 сервер для 1 клиента, но я был почти уверен, что это ужасный способ сделать это в любом случае. - person monkeymad2; 02.12.2012