Воспроизведение аудио через некоторое время после окончания другого аудио в цикле for

В настоящее время я разрабатываю веб-приложение (игру) на Tizen, где я хочу:

  1. Показать изображение
  2. Воспроизвести аудиоклип (длиной около 15-17 секунд)
  3. ничего не делать 5 секунд
  4. Воспроизвести другой аудиоклип (около 2-3 секунд)
  5. Скрыть изображение

Эти шаги должны выполняться в цикле (N раз) по порядку. Однако, когда я запускаю свое приложение на эмуляторе, оно одновременно воспроизводит все звуки, которые должны воспроизводиться на шаге 2, в то время как изображение никогда не отображается.

Ниже приведена моя функция Javascript:

         function performTask(image, audioName) { //sending id for image and audio,  e.g.: performTask("img1", "aud1")

            // Show the image
            img = document.getElementById(image);
            if (img && img.style) {
                img.style.height = screen.height;
                img.style.width = screen.width;
                img.style.visibility = "visible";
            } else {
                console.log("exercise(): error in setting image");
            }
            // play the audio
            try {
                myAudio = document.getElementById(audioName);
                myAudio.play();
                myAudio.onended = function() {
                    timeOut();
                };
            } catch (error) {
                console.error("exercise(): " + error.message);
            }
            // after 30 seconds, ring the bell!!
            try {
                console.log("playing bell");
                document.getElementById("bell").play();
            } catch (error) {
                console.error("bell: " + error.message);
            }
            //hide image
            img.style.visibility = "hidden";
        }

Функция timeOut():

        var timer = 5000;
        function timeOut() {
            if (timer > 0) {
                setTimeout(timeOut(), timer--);
            }
         }

Структура HTML-страницы, где это вызывается:

        ...
        <body onload="someFunc()"> <!-- this calls performTask() in a for-loop-->
        <p>
            <img src='images/image1.png' alt="pose1n12" id="img1" />
        .... 10 more such images
        </p>
        <p>
            <audio id="bell">
                <source src='audio/bell.mp3' type="audio/mpeg" />
            </audio>
            <audio id="aud1">
                <source src='audio/aud1.mp3' type="audio/mpeg" />
            </audio>
        .... 10 more such clips
        </p>

EDIT: Добавление определения для someFunc()

     function someFunc() { 
        var a;
        image = ''; // select image at particular count
        audioName = ''; // select respective audio
        for (a = 1; a <= 12; a++) { // the asana tracker loop
            switch (a) { // assigns image & audio
            case 1:
                image = "img1n12";
                audioName = "1N12";
                break;
            ...... continues till case 12
            }
        }
        performTask(image, audioName);
        }

Пожалуйста помоги.


person user2281204    schedule 03.03.2015    source источник
comment
Установите прослушиватель событий, когда звук закончится document.getElementById("bell").addEventListener("ended",function(){//Some Code here to change the src}); Вы можете запустить функцию или вызвать другую функцию.   -  person NewToJS    schedule 03.03.2015
comment
@NewToJS Пробовал раньше, не повезло   -  person user2281204    schedule 05.03.2015
comment
Похоже, вы расширили свой вопрос, может быть, даже усложнили. Разве вы не хотели знать, как воспроизвести другой аудиофайл после окончания текущего аудио? Я полагаю, что это был изначальный вопрос...   -  person NewToJS    schedule 05.03.2015
comment
@NewToJS Я сталкиваюсь с проблемой только при зацикливании. Индивидуальный вызов функции работает нормально. Следовательно, часть цикла for   -  person user2281204    schedule 05.03.2015
comment
Вот почему для вас важно в первую очередь четко понимать проблему, это избавит вас от необходимости редактировать свой вопрос, делая предыдущие ответы неверными. Я полагаю, что мы называем это планированием вашего вопроса, чтобы избежать путаницы или недопонимания. Вы хотели знать, как прослушать трек, заканчивающийся для воспроизведения другого, и поэтому люди дали вам ответ, чтобы сделать именно это. Я желаю вам удачи с вашим вопросом, но я не буду редактировать свой ответ каждый раз, когда вы редактируете свой вопрос. Ваш вопрос может стать «петлей» бесконечных ответов. Удачного кодирования!   -  person NewToJS    schedule 05.03.2015


Ответы (3)


Насколько я понимаю, когда звук закончил воспроизведение, возникает событие "закончено".

http://forestmist.org/blog/html5-audio-loops/

Вы можете использовать это, чтобы сделать так, чтобы этап 2 запускал этап 3, а этап 4 запускал этап 5.

person CT14.IT    schedule 03.03.2015

при воспроизведении первого аудио вы должны выполнить каждый второй шаг обратного вызова, и если вам нужно снова подождать в другой раз, вам нужно передать вызов обратно в setTimeout, следующий код немного упрощен:

// on Global scope 
var audioName = "something";
var img = document.getElementById("image_id");

showImage ();
playAudio(audioName, function () {
   playBell (); 
   hideImage ();
});

Теперь определение функций будет таким:

function showImage () {
    if (img && img.style) {
        img.style.height = screen.height;
        img.style.width = screen.width;
        img.style.visibility = "visible";
    } else {
        console.log("exercise(): error in setting image");
    }
}
function playAudio (audioName, callback) {
    try {
        myAudio = document.getElementById(audioName);
        myAudio.play();
        myAudio.onended = function() {
            setTimeout(callback, 5000); // after 5 seconds
        };
    } catch (error) {
        console.error("exercise(): " + error.message);
    }
}
function playBell () {
     try {
         console.log("playing bell");
        document.getElementById("bell").play();
    } catch (error) {
        console.error("bell: " + error.message);
    }
}
function hideImage() {
    img.style.visibility = "hidden";
}
person Khalid    schedule 03.03.2015

Здесь у меня есть два примера addEventListener('ended'). Этот прослушиватель событий должен нормально работать для того, что вы просите.

Первый метод: вызывает другую функцию ChangeSrc() и использует тот же проигрыватель.

Первый метод получит игрока по идентификатору, скажет игроку играть и добавит прослушиватель событий. Это прослушает завершившееся событие, а затем вызовет ChangeSrc(). Когда вызывается ChangeSrc, прослушиватель событий удаляется, а проигрыватель src заменяется на следующую дорожку, а затем сообщается о воспроизведении.

HTML:

<b>Method One</b><button onclick="MethodOne()">Start</button><br>
<img id="DemoImg" src="sample1.png"/><br/>
<audio id="DemoAud" controls>
  <source src='sample1.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>

JavaScript

 function MethodOne(){
    var a=document.getElementById("DemoImg");
    var b=document.getElementById("DemoAud");
    b.play();
    b.addEventListener('ended',ChangeSrc,false);
}
function ChangeSrc(){
    var a=document.getElementById("DemoImg");
    var b=document.getElementById("DemoAud");
    b.removeEventListener("ended",ChangeSrc);
        a.src="sample2.png";
        b.src="sample2.mp3";
        b.play();
}

Второй метод: использует одну функцию и два проигрывателя (как и ваш исходный код)

Этот метод очень похож на первый метод, но имеет функцию в прослушивателе событий, которая сообщает другому игроку, что нужно играть, поскольку эта функция запускается только после окончания первого аудиоклипа. Это также отобразит контейнер для изображения/проигрывателя.

HTML

<b>Method Two</b><button onclick="MethodTwo()">Start</button><br>
<div id="Demo2"  class="DemoBlock">
<img id="DemoImg2" src="sample1.png"/><br/>
<audio id="DemoAud2" controls>
  <source src='sample1.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
</div><div id="Demo3" class="DemoBlock">
<img id="DemoImg3" src="sample2.png"/><br/>
<audio id="DemoAud3" controls>
  <source src='sample2.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
</div>

JavaScript:

function MethodTwo(){
    var a=document.getElementById("DemoAud2");
    var b=document.getElementById("DemoAud3");
    a.play();
    a.addEventListener('ended',function(){
    document.getElementById("Demo3").style.display="inline-block";
    b.play();
    },false);   
}

Этот пример просто показывает вам два разных метода использования прослушивателя событий, остальное зависит от вас, чтобы интегрировать его в ваш существующий исходный код.


Исходный код демо

function MethodOne(){
	var a=document.getElementById("DemoImg");
	var b=document.getElementById("DemoAud");
	b.play();
	b.addEventListener('ended',ChangeSrc,false);
}
function ChangeSrc(){
	var a=document.getElementById("DemoImg");
	var b=document.getElementById("DemoAud");
	b.removeEventListener("ended",ChangeSrc);
		a.src="http://coded4u.com/28831485/sample2.png";
		b.src="http://coded4u.com/28831485/sample2.mp3";
		b.play();
}
function MethodTwo(){
	var a=document.getElementById("DemoAud2");
	var b=document.getElementById("DemoAud3");
	a.play();
	a.addEventListener('ended',function(){
	document.getElementById("Demo3").style.display="inline-block";
	b.play();
	},false);	
}
.DemoBlock{display:inline-block;}
#Demo3{display:none;}
<b>Method One</b><button onclick="MethodOne()">Start</button><br>
<img id="DemoImg" src="http://coded4u.com/28831485/sample1.png"/><br/>
<audio id="DemoAud" controls>
  <source src='http://coded4u.com/28831485/sample1.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
<hr/>
<b>Method Two</b><button onclick="MethodTwo()">Start</button><br>
<div id="Demo2"  class="DemoBlock">
<img id="DemoImg2" src="http://coded4u.com/28831485/sample1.png"/><br/>
<audio id="DemoAud2" controls>
  <source src='http://coded4u.com/28831485/sample1.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
</div><div id="Demo3" class="DemoBlock">
<img id="DemoImg3" src="http://coded4u.com/28831485/sample2.png"/><br/>
<audio id="DemoAud3" controls>
  <source src='http://coded4u.com/28831485/sample2.mp3' type="audio/mpeg" />
Your browser does not support the audio element.
</audio>
</div>

Надеюсь, это поможет. Удачного кодирования!

person NewToJS    schedule 05.03.2015