Потоковое видео на iPhone
Как я уже ранее писал, вещать видео на iPhone можно было начиная с самых первых версий прошивки в псевдо-потоковом режиме, как, собственно, и делал популярный сервис YouTube. Т.е. через сеть поверх HTTP-протокола отдавался mp4-файл, а сервер умел отрабатывать параметры, передаваемые плеером и формировать заголовки формата в случае, если пользователь желал посмотреть ролик с середины.
В третьей версии прошивки появилось нововведение – трансляция видео стала возможна в потоковом режиме (но тоже поверх HTTP, по вполне очевидным причинам – этот протокол без проблем преодолевает многочисленные proxy-сервера и трансляции адресов по пути следования от клиента к серверу и в обратном порядке). Теперь для потоковой трансляции необходим MPEG-TS-контейнер, на который могут ссылаться m3u8-файлы, исполняющие роль плейлистов. Помимо этого в Safari появилась поддержка тега video, позволяющая встраивать ссылки на видео в специализированные для гаджета странички.
Помимо этого, в прошивке появилась возможность организации Smooth streaming потока. Напомню, что принцип подобного вещания весьма прост – на сервере вещателя хранится несколько версий видеоролика, сжатых с разными уровнями качества (для разной пропускной способности канала между клиентом и сервером и возможностей оборудования клиента). Каждый ролик разбит на множество фрагментов (например, по 2 секунды длительностью), что позволяет плееру автоматически переключаться между вариантами во время трансляции (в полноценных трансляционных протоколах типа RTP идет просто выпадение кадров). Такая возможность также появилась и для iPhone, причем реализовать ее достаточно просто:
- перекодируем видео в нескольких вариантах под разную пропускную способность канала (например, под 3G-сеть и WiFi-сеть);
- при помощи специализированной утилиты разрезаем полученный файл на фрагменты;
- создаем для каждого варианта плейлист формата m3u8, содержащий список всех фрагментов (обычно эта задача так же может быть реализована при помощи утилиты порезки);
- создаем общий плейлист формата m3u8, включающий оба варианта с указанием пропускной способности каждого варианта;
- помещаем полученное на вэб-сервер и делаем страницу с тегом video, ссылающуюся на общий плейлист.
Обобщенный плейлист может выглядеть следующим образом:
1 2 3 4 5 | #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1024000 video_1M.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000 video_512K.m3u8 |
По умолчанию гаджет будет играть первый поток (нацеленный на пропускную способность в 1Мбитс), в случае, если производительности и/или ширины канала не хватит – переключится на следующий, которому достаточно 512Кбитс.
Подробную инструкцию по созданию видео можно почитать в статье iPhone HTTP Streaming with FFMpeg and an Open Source Segmenter, там все хорошо описано и приведены ссылки на утилиту порезки, которая потребуется дополнительно к традиционному ffmpeg. Кроме того, если вы привыкли пользоваться ffmpeg для перекодирования с применением h.264-кодека, думаю так же полезно почитать FFmpeg x264 encoding guide.
Ну и напоследок ложка дегтя в бочке меда – к сожалению, опыты показали, что на первых поколениях iPhone и iPod Touch данный подход может не сработать. По крайней мере на моем iPhone первого поколения с прошивкой 3.0 плеер выдал ошибку «Данный формат не поддерживается», при этом программный эмулятор платформы из комплекта iPhone Developer SDK без проблем проигрывал видео и даже переключался на более худшее качество, когда ему не хватило пропускной способности канала. Возможно, это уже исправлено в более новых версиях прошивки, что требует дополнительной проверки. Но не исключена ситуация, когда Apple отключила эту возможность в телефонах и плеерах первого поколения, посчитав, что производительности системы попросту не хватит.
Пример реализации вышеописанного принципа можно посмотреть на моем проекте сериалов в HD-качестве – краткая инструкция по использованию, собственно сайт для iPhone.



[...] предыдущей заметке я рассказал про то, как сделать видео для iPhone, которое [...]