Слежение за состоянием воспроизведения (playstate) Windows Media Player Плагина. Play State Change Event

В данной статье я покажу как заставить Windows Media Player Plugin (type=»application/x-ms-wmp») показывать состояние (playState) воспроизведения – то, что плеер делает с потоком в данный момент, буферизируе поток, соединяется с сервером, либо воспроизводит тишину. Для этого я использую в IE attachEvent(«playStateChange»,send_status); и в FireFox — OnDSPlayStateChangeEvt(NewState). Также видны общие принципы вставки плеера на совою страничку.

Столкнулся на днях с задачей: на странице вставлен с помощью EMBED (OBJECT на случай с IE) Windows Media Player Plugin (type=»application/x-ms-wmp»). С помощью этого плагина я собираюсь проигрывать радио каналы.
Единственная неприятность используемого плагина – это необходимость установки его для Opera и FireFox. Если у вас просит плагин, его необходимо установить, кликнув на уведомление. Но есть и плюс – с IE данный плагин идёт из коробки. А это означает, что народ с ограниченными правами может без всяких установок слушать или смотреть видео с вашего сайта.
Внешний вид Windows Media Player меня немного не устраивал, поэтому пришлось его спрятать, и все элементы продублировать на страничке. Также на перспективу собираюсь использовать другие плееры, и необходимость в унификации интерфейса стоит остро.

Задача стоит в том, как заставить плеер показывать состояние воспроизведения – то, что плеер делает с потоком в данный момент, буферизирует поток, соединяется с сервером, либо воспроизводит тишину. Иначе если какой либо поток соединяется долго либо вообще не соединяется, пользователь это должен как-то видеть. А то подумает, что мой интерфейс не работает из за долгой паузы и тишины, которой никак не избежать при плохой скорости канала у клиента или высокого битрейта потока.

Мне удалось найти решение для всех браузеров, правда для IE отдельно.

Вообще состояние плеера можно достать через Свойство PlayState (playState property). Данное свойство только для чтения. Но меня не радовала идея, в цикле читать это свойство и выдавать на интерфейс состояния плеера. Я вообще против любых циклов.

Поэтому я пошел дальше и начал копать в сторону Событий. Ведь логично, что плеер сам каким-то образом шлёт мне в случае смены состояния — событие, и дальше я мог бы проверять указанное свойство. В итоге вот к чему я пришел…

У меня есть вот такой object с embed в нутрии:

sendplaystatechangeevents=»true»
>

Обратите внимание, я везде, и в object и в embed добавил параметр SendPlayStateChangeEvents, который указывает плееру о необходимости отсылки нам события о изменении состояния воспроизведения, а также и сам статус. Блок div с id=»status» с самого начала я буду использовать для вывода состояния.

Т.к. Internet Explorer использует только object, сразу же за кодом object вставка на JavaScript, которая выглядит следующим образом:



Здесь мы с помощью attachEvent указываем плееру, какую функцию необходимо использовать при смене статуса. В функции send_status вызывается функция view_status для вывода статуса. В качестве параметра используется WMP.playstate, который содержит ID текущего статуса. Все идентификаторы перечислены в массиве WMState:



Но данный код работает только с Object, а что же делать с embed. Ну а тут всё просто…

Для того, чтобы статус можно было отслеживать в FireFox, Opera и других браузерах, использующих embed, нам необходимо добавить функцию OnDSPlayStateChangeEvt(NewState), которая вызывается плеером в случае смены состояния и в качестве параметра принимает ID статуса:



Ну таким образом у меня всё работает – ниже пример вывода статуса (интерфейс плагина виден, т.к. интерфейс переносить некогда 🙂 ).

Название радио: #MUSIK.JAM — WWW.RAUTEMUSIK.FM — 24H HIPHOP RNB RAP SOUL REGGAE DANCEHALL URBAN AND MORE!

Статус воспроизведения:


Ну ладно — буду по не многу разбираться дальше, как выводить прогресс буферизации. Как что-то накопаю – отпишусь.

Добавить комментарий