Прямая трансляция HTTP для iPhone

Я следую предложению Apple в http://tools.ietf.org/html/draft-pantos-http-live-streaming-01. Пробуя фиктивную HTTP Live Streaming на свой iphone, я написал веб-сервис с Django, соответствующий файлу .m3u8. Я начинаю ответ с

#EXTM3U
#EXT-X-TARGETDURATION:#10
#EXT-X-MEDIA-SEQUENCE:#0

Затем я пишу URL-адреса сегментов (6 сегментов по 10 секунд каждый) внутри ответа:

#EXTINF:10,
http://...../sample_low-1.ts
...

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

Однако, когда я проверяю поток на своем iphone, я наблюдаю следующее:

Телефон подключается к ...m3u8 , получает его содержимое, начинает скачивать файлы .ts и начинает показывать видео. Затем, после загрузки 6-го сегмента (последний сегмент в .m3u8), он достигает конца файла, не видит

EXT-X-ENDLIST

и ищет новый .m3u8. На данный момент новый .m3u8 готов на сервере, так как я обновляю содержимое .m3u8 каждые 60 секунд.

Однако телефон останавливается, и я не могу добиться непрерывного потока на телефоне.

Так что, очевидно, я где-то делаю огромную ошибку. Любая помощь и предложения очень приветствуются.

Редактировать: оказывается, что увеличение последовательности мультимедиа работает.


person ahmet emrah    schedule 07.02.2010    source источник


Ответы (1)


Как вы отправляете ответ обратно?
Если вы return отправляете объект ответа Django, то сервер просто отправляет ответ с шестью сегментами, а затем спокойно сидит, ожидая нового запроса от клиента.
Если вы хотите постоянно отправлять данные с сервера, вам следует вместо этого yield получить результат и использовать некоторую синхронизацию, чтобы вы были уверены, что не отправляете одни и те же данные снова и снова.

person rob    schedule 07.02.2010
comment
Я возвращаю объект ответа Django с содержимым, которое я упомянул в исходном сообщении. Тем не менее, я думаю, что это то, что я должен делать, просто регулярно меняйте индексный файл .m3u8. Я ошибся? - person ahmet emrah; 08.02.2010
comment
Если вы используете ключевое слово return, то ответ завершен, и Django будет ждать нового запроса от клиента. С другой стороны, если вы используете ключевое слово yield, то ответ не будет полным, и Django будет продолжать кормить клиента новыми данными, пока вы его не остановите или пока соединение не будет разорвано. - person rob; 08.02.2010