Как работает потоковая передача по протоколу HTTP с адаптивным битрейтом на iPhone?
-
21-08-2019 - |
Вопрос
Apple включила потоковую передачу по протоколу HTTP Adaptive Bitrate в iPhone OS 3.0, в частности, Safari обрабатывает это автоматически.
Я бы хотел поиграть с этим недорогим способом, но я ожидаю, что для этого потребуется пользовательский HTTP-сервер в худшем случае и интересные сценарии PHP / etc в лучшем случае.
Но сначала мне нужно знать, в чем заключаются различия в протоколах или стандартах.HTTP достаточно прост как протокол, но адаптивный битрейт означает, что размер файла отличается, расположение фрагментов отличается при разных битрейтах и т.д.Например, сообщает ли клиент серверу что-либо особенное о потоке во время его загрузки, или все это обрабатывается на стороне сервера?
Устранение пауз буферизации для конечного пользователя очень привлекательно как для прямых, так и для предварительно записанных видеопотоков, а выполнение обоих операций по протоколу HTTP еще лучше, учитывая, что многие сети и правительства ограничивают трафик, не связанный с портом 80.
- Каковы технические детали потоковой передачи по протоколу HTTP adaptive bitrate, особенно реализация Apple?
Где это лучше всего реализовано - частично на самом HTTP-сервере, частично в моде, в скрипте ...?
Какие изменения требуются на стороне клиента, если бы кто-то хотел реализовать это в приложении?
Решение
Обновить
Похоже, Apple подготовила проект предложения IETF, и некоторые люди уже работают над сегментаторами:
HTTP Прямая трансляция - черновик-пантос-http-прямая трансляция-01
http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt
Потоковая передача HTTP для iPhone с помощью FFMpeg и Segmenter с открытым исходным кодом
http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/
Похоже, HTTP-сервер действует просто как тупой HTTP-сервер.Просмотр примера веб-сайта, предоставленного Akamai, дает мне достаточно информации, чтобы начать работу со статической потоковой передачей контента.
Официальный документ ( 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
med/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
lo/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:
<video width="640" height="480">
<source src="content1/content1.m3u8" />
</video>
Остается еще много вопросов без ответов, но этого, вероятно, достаточно, чтобы начать.
Другие советы
И небольшой проигрыватель на Python + GStreamer http://code.google.com/p/hls-player/
Смотрите это для кодировщика с открытым исходным кодом, сегментатора и некоторых других интересных вещей :)