1 (изменено: Poltergeyst, 2016-04-24 15:32:42)

Тема: 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>&nbsp</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>
 */}