30
Ноя

Потоковое видео на 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.

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

  2. Доброго дня.
    Спасибо за статью.
    А как быть если есть ip-camera (http://www.grandstream.com/products/gxv_series_surveillance/gxv3601/gxv3601.html)
    Она замечательно подключается к флеш плееру, но нужно и iPhone показывать видео.
    Без перекодирования это возможно?
    Спасибо.

    google.com Максим Крентовский

    Если я правильно понял, камера может отдавать вполне честный h.264-поток. А значит, в теории, если пропустить ее через erlyvideo, то можно вещать и на iPhone, и на Flash. На практике, как всегда, будут нюансы, но без них никуда. :)

    Vladimir

    Как получается.
    Я вставляю в флеш http://XXX.XXX.XXX/.
    Он это воспринимает на ура.
    А вот когда вставляю в тег никакой реакции.

    Может можно как-то хитро сделать файл .m3u8, какие-то параметры передать? Если вставляю в m3u8, а в нем ссылку на поток, это не дает результатов.

    Поток там 264, хотелось просматривать без использования медиа сервера. Возникает такой вопрос в чем будет разница между текущим потоком, от того что мы получим из медиа сервера?

    google.com Максим Крентовский

    Ну, у меня есть большие сомнения, что камера сможет сама гнать TS-поток поверх HTTP, как то требует Apple. Поэтому лучше все же использовать erly или Wowza для перепаковки в нужный формат. Помимо этого медиа-сервер наверняка лучше камеры знает, как работать с большим количеством пользователей, которые могут «внезапно» захотеть посмотреть видео. Ну и, конечно же, не будет перегружаться сама камера большим числом соединений, что для ее слабого процессора может быть весьма болезненно. Ну и вообще выставлять камеру голым хвостом в интернет не очень хорошо. :)

    Иными словами, медиа-сервер — это такой мультиплексор потока, который очень удобно и полезно применять.

Максим Крентовский
системный архитектор
E-mail / GTalk: mkrentovskiy@gmail.com
Skype: mkrentovskiy