Как работает потоковая передача HTTP с адаптивным битрейтом на iPhone?

Apple включила адаптивную потоковую передачу битрейта HTTP в iPhone OS 3.0, в частности, Safari обрабатывает это автоматически.

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

Но сначала мне нужно знать, каковы различия протокола или стандарт. HTTP достаточно прост как протокол, но адаптивный битрейт означает, что размер файла отличается, расположение фрагментов отличается при разных битрейтах и ​​т. д. Например, сообщает ли клиент серверу что-то особенное о потоке во время его загрузки или все обрабатывается на стороне сервера?

Устранение пауз буферизации для конечного пользователя очень привлекательно как для живых, так и для предварительно записанных видеопотоков, а выполнение обоих через HTTP еще лучше, учитывая, что многие сети и правительства ограничивают трафик, не относящийся к порту 80.

  • Каковы технические детали потоковой передачи HTTP с адаптивным битрейтом, особенно реализация Apple?
  • Где это лучше всего реализовано - часть самого HTTP-сервера, часть мода, скрипт...?

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


person Adam Davis    schedule 01.07.2009    source источник


Ответы (3)


Обновлять

Похоже, Apple сделала проект предложения IETF, и некоторые люди уже работают над сегментаторами:

Прямая трансляция HTTP — draft-pantos-http-live-streaming-01
http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt

Потоковое вещание iPhone по протоколу HTTP с помощью FFMpeg и сегментатора с открытым исходным кодом
http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/


Похоже, HTTP-сервер действует просто как тупой HTTP-сервер. Изучение примера веб-сайта, предоставленного Akamai, дало мне достаточно информации, чтобы начать работу с потоковой передачей статического контента.

http://iphone.akamai.com/

Технический документ ( http://www.akamai.com/dl/akamai/iphone_wp.pdf ) предоставляет информацию о кодировании транспортного потока, поэтому потоки .ts являются простыми.

Кодер (или отдельный процесс сегментации) будет создавать контент H.264/AAC в виде последовательности небольших сегментов контента в формате MPEG-2 TS (.ts). Существует также индексный файл M3U8, который ссылается на сегменты; в случае живого контента M3U8 постоянно обновляется, чтобы отражать последний контент.

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

Веб-сайт предоставляет файл M3U8, который представляет собой просто список воспроизведения M3U, но в формате кодировки символов UTF-8.

Затем этот файл связывается с файлом M3U8 для каждого битрейта. Я предполагаю, что все они должны иметь переходы в одних и тех же местах (например, каждые 2 или 10 секунд), чтобы переключение могло быть плавным. Похоже, что это полностью зависит от клиента - клиент решает, как измерить пропускную способность и какую версию он получит.

Содержимое основного файла:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000
hi/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000
med/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
lo/prog_index.m3u8

Затем каждый из остальных файлов:

привет/prog_index.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
fileSequence0.ts
#EXTINF:10, 
fileSequence1.ts
#EXTINF:10, 
fileSequence2.ts
#EXTINF:10, 
fileSequence3.ts
#EXTINF:1,  
fileSequence4.ts
#EXT-X-ENDLIST

мед/прог_индекс.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
fileSequence0.ts
#EXTINF:10, 
fileSequence1.ts
#EXTINF:10, 
fileSequence2.ts
#EXTINF:10, 
fileSequence3.ts
#EXTINF:1,  
fileSequence4.ts
#EXT-X-ENDLIST

вот/prog_index.m3u8

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
fileSequence0.ts
#EXTINF:10, 
fileSequence1.ts
#EXTINF:10, 
fileSequence2.ts
#EXTINF:10, 
fileSequence3.ts
#EXTINF:1,  
fileSequence4.ts
#EXT-X-ENDLIST

Это работает с тегом видео HTML 5:

<video width="640" height="480">
   <source src="content1/content1.m3u8" />
</video>

Осталось еще много вопросов без ответов, но этого, пожалуй, достаточно для начала.

person Adam Davis    schedule 01.07.2009

И небольшой плеер в Python+GStreamer http://code.google.com/p/hls-player/

person elmarco    schedule 15.01.2010

См. это для кодировщика с открытым исходным кодом и сегментатора и некоторых других интересных вещей :)

http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/

person woo    schedule 29.07.2009