Тема: JScript: Воспроизведение mp3 с помощью команд MCI
Без гарантий, используете на свой страх и риск.
Воспроизведение mp3 файла с помощью команд MCI. Чтобы проиграть mp3 файл, нужно перетащить его на значок скрипта. Текущая позиция воспроизведения устанавливается щелчком по индикатору прогресса в окне Internet Explorer.
Потребуется зарегистрированная библиотека scrsvc.dll(желательно использовать последнюю выкладку).
P.S.:
К сожалению, при открытии отдельных mp3 файлов, команда MCI 'open' дает сбой, что видимо зависит от компрессора, которым сжимался тот или иной mp3.
ОС WinXP
mp3play.js
/*
Воспроизведение mp3 файла с помощью команд MCI.
JScript
ОС WinXP
*/
// Проверка аргументов
//----------------------------------------------------------
var sFileMp3Long;
var lStrLen;
var sFilePlay;
var args = WScript.Arguments
if (args.Length)
{
sFileMp3Long = String(args.Item(0));
lStrLen = sFileMp3Long.length;
sFilePlay = sFileMp3Long.substring(sFileMp3Long.lastIndexOf('\\',lStrLen) + 1,lStrLen);
}
else
{
WScript.Echo('Отсутствует входной аргумент - mp3 файл для воспроизведения.');
WScript.Quit();
}
// Создание объектов
//----------------------------------------------------------
var oScrSvc = new ActiveXObject('ScriptService.Service');
var ieObj = WScript.CreateObject('InternetExplorer.Application','IE_');
with (ieObj)
{
Offline = true;
Navigate('about:blank');
while (Busy){WScript.Sleep(50);}
StatusBar = false;
ToolBar = false;
MenuBar = false;
Left = 0;
Top = 0;
Width = 420;
Height = 50;
Visible = true;
while (Busy){WScript.Sleep(50);}
}
// Внедрение кода в документ
//----------------------------------------------------------
var oDoc = ieObj.Document;
var s = new String(string_resource1);
var r = /(function.+\s*{\s*)|(\/\*\s*)|(\s*\*\/)|(\s*})/igm;
var sInnerCode = s.replace(r,'');
oDoc.write(sInnerCode);
// Внедрение скрипта в документ
//----------------------------------------------------------
oDoc.myproperty = this;
var oScr = oDoc.createElement('SCRIPT');
oScr.text = 'function pulseinvoke(){document.myproperty.PulseTimer();}\n\rfunction document.onclick(){document.myproperty.SetPosition(event.offsetX);}'
oDoc.body.appendChild(oScr);
var oPr = oDoc.getElementById('progress');
//----------------------------------------------------------
var sRetStr1 = AllocStr(32);
var pRetStr1 = oScrSvc.struct_setval(sRetStr1);
var lPos, lCur, lLength;
// Отправка команд воспроизведения файла
//----------------------------------------------------------
mcisend('open'+String.fromCharCode(32) + '"' + sFileMp3Long + '"' + String.fromCharCode(32)+'type MPEGVideo alias mp3play',false);
mcisend('setaudio mp3play volume to 1000', false);
mcisend('set mp3play time format milliseconds', false);
mcisend('set mp3play seek exactly on', false);
lLength = Number(mcisend('status mp3play length', true));
oDoc.parentWindow.setInterval('pulseinvoke()',100);
oDoc.title = sFilePlay;
initplay();
// Цикл удержания
//----------------------------------------------------------
while (1)
{
WScript.Sleep(500);
}
//
// Запуск воспроизведения
//
//----------------------------------------------------
function initplay()
{
mcisend('seek mp3play to 400', false);
mcisend('play mp3play', false);
}
//
// Установка индикатора воспроизведения
//
//----------------------------------------------------------
function PulseTimer()
{
try
{
lPos = Number(mcisend('status mp3play position', true));
lCur = Math.round((lPos/lLength)*400);
oPr.style.width = lCur;
}
catch(e){}
// Перезапуск
//--------------------------------------------------
if (lCur==400)
{
WScript.Sleep(100);
initplay();
}
}
//
// Установка позиции воспроизведения
//
//----------------------------------------------------------
function SetPosition(lX)
{
oPr.style.width = Number(lX);
mcisend(String('seek mp3play to ' + Math.round((lX/400)*lLength)), false);
mcisend('play mp3play repeat', false);
}
//
// Отправка команды MCI
//
//----------------------------------------------------------
function mcisend(sCmd, bf)
{
//---------------------------------------------------
if (bf)
{
sRetStr = sRetStr1;
pRetStr = pRetStr1;
}
else
{
sRetStr = '';
pRetStr = 0;
}
//---------------------------------------------------
with (oScrSvc)
{
set_strarg(0, sCmd, true);
set_vararg(1, pRetStr);
set_vararg(2, Number(sRetStr.length));
set_vararg(3, 0);
lRes = api_call('WINMM.DLL','mciSendStringW',4, 1); //1 - индекс повторного вызова(запоминание адреса функции)
}
//---------------------------------------------------
if (lRes!=0)
{
WScript.Echo('Произошла ошибка.\n\rКоманда: '+sCmd);
ieObj.Quit();
WScript.Sleep(100);
}
//---------------------------------------------------
if (bf){return oScrSvc.pull_string(pRetStr, true);}
return;
}
//
// Выделение строки заданной длины
//
//----------------------------------------------------------
function AllocStr(lStrLen)
{
var sStr = '\0';
for (i=0;i<lStrLen-1;i++)
sStr = sStr + '\0';
return sStr;
}
//
// Завершение работы
//
//----------------------------------------------------------
function IE_OnQuit()
{
mcisend('stop mp3play', false);
mcisend('close mp3play', false);
oScrSvc = null;
ieObj = null;
WScript.Quit();
}
// HTML код
//----------------------------------------------------------
function string_resource1()
{/*
<HTML>
<TITLE> </TITLE>
<HEAD>
<META HTTP-EQUIV=Content-Type content='text/html;charset=windows-1251'>
</HEAD>
<BODY SCROLL="NO">
<HR ID='progress' style='position: absolute; left: 0px; top:0px; width: 400px; height:20px; background-color: #808000;'>
<HR ID='set' style='position: absolute; left: 0px; top:30px; width: 400px; height:5px; background-color: #c0c0c0;'>
</BODY>
</HTML>
*/}