JW Player, ActionScript и тройка маленьких плагинов
Как известно, видео на стороне клиента можно проигрывать большим количеством вариантов:
- через Flash-проигрыватель — наверное, самый распространенный вариант;
- через Silverlight-проигрыватель;
- через ActiveX-элемент, реализуемый каким-либо установленным проигрывателем в системе (Windows-метод);
- через тег video согласно стандарту HTML5 (если браузер поддерживает);
- через системный видео-проигрыватель (например, VLC);
- посредством медиа-центра (например, Plex и XBMC).
Соответственно, чем больше средств предоставлено пользователю на сайте, тем больше вероятность, что он с комфортом посмотрит интересующий его видеоролик (сейчас мы сознательно упрощаем вопрос, игнорируя тот факт, что пользователь может хотеть смотреть видео на нетбуке, таблетке или смартфоне). Однако в крайнем случае можно использовать Flash-проигрыватель, как самый распространенный вариант.
В процессе работы над hdin.tv я использовал проигрыватель JW Player компании LongTail Video. Достаточно функциональный, с системой дополнительных модулей и легко настраиваемый через параметры встраивания.
По мере развития ресурса пользователи добавили в список пожеланий возможность управлять проигрывателем при помощи клавиатуры (что очень удобно, неоднократно сам замечал), подключать субтитры и оригинальные звуковые дорожки. Весь ожидаемый функционал был реализован в виде отдельных модулей, расположенных на сайте разработчика, поэтому проблем, как мне показалось, быть не должно.
Однако не все так просто. Дело в том, что достаточно недавно JW Player сменил цифру в начале именования версий с 4 на 5. С новым API для плагинов, почти полностью переписанный, он сохранил совместимость со старыми модулями, но не со всеми и не всегда на очень хорошем уровне. Т.е. при подключении возможны были сбои в работе как плагина, так и плеера. В результате пришлось хорошенько потрудится над кодом модулей, благо они весьма благополучно могли собираться при помощи Flex SDK, доступной под Линукс, а про ActionScript я что-то помнил, когда занимался Flash-элементами для сайтов. Поскольку исходный код модулей распространялся под лицензией GPL, соответственно, было бы неправильным держать код в тайне, тем более что и тайны никакой нету, и моего труда в нем мало.
Как собирать плагины
Потребуется Flex SDK (берется на сайте Adobe, прямую ссылку не даю, поскольку оно там неплохо разбросано). Далее, пишем Shell-сценарий для упрощения процедуры.
1 2 3 | #!/bin/bash FLEXPATH=/home/mkrentovskiy/Flex/sdks/3.0.0 $FLEXPATH/bin/mxmlc ./com/jeroenwijering/plugins/Captions.as -sp ./ -o ./captions.swf -use-network=false |
Тут одна особенность — для компиляции вам лучше всего взять все исходники плеера, поскольку код модулей содержит ссылки на классы проигрывателя. В некоторых случаях могут потребоваться начальный код плагинов, который так же можно взять с репозитария.
Shortcuts
Этот модуль отвечал за управление плеера горячими клавишами, превосходно работал на 4.х, но категорически отказывался на 5-й. В результате, его пришлось переписать полностью и выкинуть вспомогательные фишки наподобие пошагового проигрывания. В результате осталось только управление процессом проигрывания (пуск, пауза, стоп), перемещение по плейлисту, включение/выключение полноэкранного режима и управление уровнем звука.
Captions
Модуль субтитров практически не изменился, за исключением того, что я убрал кнопку включения / выключения модулей (на сайте это сделано через JavaScript) и подвинул повыше отображаемые субтитры — в случае, когда панель управления воспроизведением автоматически убиралась с экрана, модуль неправильно рассчитывал позицию, в результате чего субтитры блокировали управление воспроизведением.
Audiodescription
Модуль наложения дополнительной звуковой дорожки также подвергся незначительным изменениям. Во-первых, было отключено автоматический запуск звука до начала воспроизведения (возможно, это не было ошибкой, но явно не входило в логику работы проигрывателя). Во-вторых, также были удалены кнопки управления включением / выключением плагина, поскольку эта функциональность реализовывалась при помощи JavaScript. В-третьих, было добавлено выключение основного звука, поскольку в случае незначительной рассинхронизации дорожек могло появляться неприятное эхо. По-хорошему надо было сделать отдельный элемент управления, позволяющий пользователю управлять громкостью воспроизведения дополнительной дорожки, но, увы, мои познания в Flash не столь значительны, чтобы сделать это.
В целом, JW Player — на редкость удобный инструмент, а новое API для плагинов — простое и понятное. Думаю, рано или поздно авторы плагинов приведут свои разработки к новому API и тогда сделанные мной «костыли» не потребуются.

[...] JW Player, позволяющий нарастить функционал проигрывания (добавить субтитры и дополнительные дорожки, задейство…), который достаточно просто конфигурируется через [...]