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

Вывод прогресса буферизации. network.bufferingProgress Windows Media Player Плагина.

В дополнение к статье Слежение за состоянием воспроизведения (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"

Ответить

  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

Image CAPTCHA
Enter the characters shown in the image.
Поделиться: