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
return file.read()
, является ли файл файловым объектом, объектом Popen или чем-то еще? Если это объектPopen
, вам следует рассмотреть возможность использованияreactor.spawnProcess()
скрученного, чтобы получить протокол, который вы можете подключить к обработчику http для выполнения потокового чтения. - person fmoo   schedule 02.12.2012