Согласно народной примете, в новый дом первым нужно впускать интернет-кабель. И где он ляжет - там ставьте кровать. И стол. И комп. И жрачку.
В дополнение к статье Слежение за состоянием воспроизведения (playstate), которую я опубликовал ранее. Немного разобравшись, дополнил код выводом в статус прогресса буферизации, а также пришлось добавить проверку, какой же всё таки используется плеер - тот что в Embed или же в Object и вообще, установлен ли плагин WMP. Пожалуй со второго и начнём...
С прошлого раза HTML почти не поменялся(Другое радио только поставил ;) ) :
Название станции: "Oi fm 101.5" Жанр: "Hard Rock" Страна: "Finland" Битрейт: "192"<br /> <div id="status"></div><br /> <object id="wmplayer" width="300px" height="100px" classid="clsid:6bf52a52-394a-11d3-b153-00c04f79faa6" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6, 4, 5, 715" standby="Loading Microsoft Windows Media Player components..." type="application/x-ms-wmp"> <param name="filename" value="http://media.innoventum.fi:8000/oifm"></param> <param name="url" value="http://media.innoventum.fi:8000/oifm"/> <param name="AutoStart" value="false"/> <param name="uiMode" value="mini"/> <param name="AllowChangeDisplaySize" value="false"/> <param name="AutoSize" value="false"/> <param name="ShowDisplay" value="true"> <param name="showPositionControls" value="false"/> <param name="showTracker" value="false"/> <param name="showStatusBar" value="false"/> <param name="fullScreen" value="false"/> <param name="ShowControls" value="true"/> <param name="stretchToFit" value="false"/> <param name="enablecontextmenu" value="false"/> <param name="SendPlayStateChangeEvents" value="true"/> <embed id="wmplayer_embed" width="300px" height="100px" type="application/x-ms-wmp" url="http://media.innoventum.fi:8000/oifm" src="http://media.innoventum.fi:8000/oifm" autostart="false" uimode="mini" allowchangedisplaysize="false" autosize="true" showdisplay="true" showpositioncontrols="false" showtracker="false" showstatusbar="true" fullscreen="false" showcontrols="true" enablecontextmenu="false" stretchtofit="true" enablefullscreencontrols="true" sendplaystatechangeevents="true" ></embed>
Первым делом я пытаюсь определить - по какому ID обращаться к плееру можно? Это в нашем случае wmplayer_embed или же wmplayer.
//Здесь будем хранить ссылку на используемый плеер. var player_current = false; //Состояния плеера var WMState = new Array(); WMState[0] = "Undefined"; WMState[1] = "Stopped"; WMState[2] = "Paused"; WMState[3] = "Playing"; WMState[4] = "Scan Forward"; WMState[5] = "Scan Reverse"; WMState[6] = "Buffering"; WMState[7] = "Waiting"; WMState[8] = "Media Ended"; WMState[9] = "Transitioning"; WMState[10] = "Ready"; WMState[11] = "Reconnecting"; //Проверка на созданный Embed try { player_ebd = document.getElementById('wmplayer_embed'); if(player_ebd.enabled) { player_current = player_ebd; } }catch(err){} //Проверка на созданный Object try { player_obj = document.getElementById('wmplayer'); if(player_obj.enabled) { player_current = player_obj; player_current.attachEvent("playStateChange",send_status); } }catch(err){} //Вызывается для Object в событии playStateChange function send_status() { view_status(player_current.playstate); } //вызывается при изменении состояния плеером в FireFox, //Opera и других браузерах, использующих embed function OnDSPlayStateChangeEvt(NewState) { view_status(NewState); }
Процесс проверки необходимо в try вставить, т.к. ищем мы старым добрым методом тыка))).
Здесь мы попыталь обратиться к свойству "enabled" для каждого ID плеера. Тот, который отзовётся и есть используемый плеер, мы его загоняем в player_current и в дальнейшем обращаемся к нему. Немного ниже мы видим старые добрые функции, вызываемые в случае события "playStateChange" - OnDSPlayStateChangeEvt и send_status.
Также интересно то, что в случае если player_current не определён, мы имеем дело с ситуацией, когда плагин Windows Media Player просто не установлен. Поэтому у меня появилась вот такая проверка:
//Если плагин вообще не подключился if (!player_current) { document.getElementById('status').innerHTML = "Плагин WMP не установлен. Установите его для прослушивания радиостанции."; }
Далее приступим к получению прогресса буферизации.
Вообще есть событие buffering(Start), которое позволяет отследит появление буферизации. Но т.к. я уже отслеживаю состояние плеера, мудрить с функциями отдельно для браузеров использующих Object и отдельно для использующих Embed мне не хотелось. Поэтому я просто на основе старой доброй функции view_status сделал проверки на состояние буферизации потока и в случае, если такая имеет место - с задержкой опрашиваю свойство network.bufferingProgress:
//Глобальная переменная для хранения текущего статуса var status_tmp = 0; //Функция, пересылающая состояние плеера. function view_status(status) { status_tmp = status; document.getElementById("status").innerHTML = "Status: "+WMState[status]; if (status == 6) { setTimeout("view_buff()",100); } } //Выводим текущий прогресс буферизации function view_buff() { if(status_tmp == 6) { document.getElementById("status").innerHTML = "Status: "+WMState[status_tmp]+" "+player_current.network.bufferingProgress+"%"; setTimeout("view_buff()",100); } }
Здесь мы создаём глобальную переменную status_tmp, с помощью которой далее отсекаем изменение статуса в случае, когда статус уже отличный от буферизации, а мы еще хотим вывести прогресс после задержки.
Собственно ничего сложного, но возможно кому-то поможет немного сохранить своё время.
Вот пример того, что у меня получилось в итоге:
Название станции: "Oi fm 101.5" Жанр: "Hard Rock" Страна: "Finland" Битрейт: "192"
Комментарии
Отправить комментарий