Доброго времени суток. Давно я тут не появлялся. Но вот проблема.
Появилась задача создать кроссбраузерный плеер, проигрывающий нужные звуки по запросу из JavaScript.
ActionScript в первом и единственном кадре:
Код:
|
import flash.external.ExternalInterface;
function playSound (s) {
var sound = new Sound();
sound.attachSound(s);
sound.start();
}
ExternalInterface.addCallback('play', null, playSound); |
Вставка ролика:
<div id="player">
<object width="1" height="1" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
<param name="allowScriptAccess" value="sameDomain">
<param name="movie" value="sounds.swf">
<embed width="1" height="1" src="sounds.swf" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" scale="exactfit" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
</object>
</div>
И javascript
:
sounds = {
_movie: null,
init: function() {
var ie = '\v'==='v';
this._movie = document.getElementById('player').getElementsByTagName(ie ? 'object' : 'embed')[0];
},
play: function(s) {
this._movie.play(s);
}
}
sounds.init вызывается при загрузке страницы.
Во флеш-ролике есть звук twins. Импорт для ActionScript включён.
Когда пишу в консоль
sounds.play('twins') выскакивает ошибка
uncaught exception: Error in Actionscript. Use a try/catch block to find error.
Нет во флеш никаких ошибок. Я проверял (вызов playSound в AS проходит нормально). Очевидно, ошибка возникает при работе ExternalInterface.
-------------------------------------------------
Пробовал вместо ExternalInterface использовать SetVariable
AS:
Код:
|
mes = null;
function playSound (s) {
var sound = new Sound();
sound.attachSound(s);
sound.start();
}
_root.onEnterFrame = function() {
if (mes!==null) {
playSound(mes);
mes = null;
}
} |
javascript
:
sounds = {
_movie: null,
init: function() {
var ie = '\v'==='v';
this._movie = document.getElementById('player').getElementsByTagName(ie ? 'object' : 'embed')[0];
},
play: function(s) {
this._movie.SetVariable('mes', s);
}
}
Теперь при вызове sounds.play получаем:
Error: Error calling method on NPObject!
this._movie.SetVariable('mes', s);
Что такое NPObject?!!
Гугл не помог. Помогите понять, в чём проблема.
-------------Это можно не читать-----------------
Я пробовал ещё один способ. sounds.play пихал звук в конец массива, а AS на каждом кадре через ExternalInterface вызывал sounds.getStack, возвращавший и удалявший первый элемент этого массива, либо false, если элементов нет. Это работало, но с ощутимой задержкой. Поэтому решил не извращаться, а разобраться с ошибками.