onended działa od początku pliku dźwiękowego zamiast od końca

0

Witam!

Co mam zmienić w poniższym kodzie, aby każdy następny plik odtwarzany był z podaną wartością setTimeout, która działa faktycznie od zakończenia ostatniego utworu.
W tym skrypcie setTimeout działa od początku utworu n do początku utworu n+1, przez co muszę ustawiać setTimeout porównywalny z długością ostatniego pliku, aby przerwy w odtwarzaniu plików były zerowe. Gdyby skrypt działał faktycznie zgodnie z instrukcją "setTimeout", ustawiłbym po prostu każdy setTimeout na "0".
Bardzo dziękuję za pomoc.

<html> <head> <script> var tysiac = document.createElement('audio'); tysiac.src = "tysiac.mp3"; tysiac.preload = 'auto'; tysiac.play(); tysiac.onended=setTimeout(dziewiecset, 600);

function dziewiecset()
{
var dziewiecset = document.createElement('audio');
dziewiecset.src = "dziewiecset.mp3";
dziewiecset.preload = 'auto';
dziewiecset.play();
dziewiecset.onended=setTimeout(szescdziesiat, 1000);
}

function szescdziesiat()
{
var szescdziesiat = document.createElement('audio');
szescdziesiat.src = "szescdziesiat.mp3";
szescdziesiat.preload = 'auto';
szescdziesiat.play();
szescdziesiat.onended=setTimeout(jeden, 900);
}

function jeden()
{
var jeden = document.createElement('audio');
jeden.src = "jeden.mp3";
jeden.preload = 'auto';
jeden.play();
}

</script> </head> <body> </body> </html>
0

Tak, o to chodzi. Skrypt działa, ale ja chcę, aby odstęp był liczony od końca odtwarzania poprzedniego pliku, a nie od początku, bo tak właśnie działa ten skrypt - niezgodnie z instrukcją onended. Nie rozumiem, gdzie jest Twoja odpowiedź - widzę ją tylko w mailu powiadamiającym.

0

@samaia: zgroza... szkoda oczu... używaj wstawiania kodu źródłowego </>.

Nie ma potrzemy tworzenia obiektu AUDIO dla każdego pliku
Podmień kody JavaScript.

var audio = document.createElement('audio'); // Tworzymy obiekt AUDIO
var AudioIndex = 0; // Numer pliku z listy który ma zostać odtworzony

var list = []; // Lista plików do odtworzenia
list[0] = ["tysiac.mp3","1000"];
list[1] = ["dziewiecset.mp3","900"];
list[2] = ["jeden.mp3","600"];
//list[<-- liczba porządkowa -->] = ["<-- plik mp3 -->","<-- czas (w milisekundach) po jakim ma zostać odtworzony kolejny plik -->"];

audio.src=list[AudioIndex][0];
audio.play();


audio.onended = function() {
	audio.pause(); // Zatrzymujemy odtwarzanie
	AudioIndex++; // Dodajemy AudioIndex+1 
	if(AudioIndex > list.length-1) { // Sprawdzamy czy AudioIndex nie jest większę od liczby plików
		AudioIndex = 0; // Jeśli AudioIndex jest większę od liczby plików to ustawiamy go na '0'
	}
	audio.src=list[AudioIndex][0]; // Ustawiamy link do pliku
	audio.load();
	window.setTimeout(function() {
		audio.play(); // Rozpoczynamy odtwarznie pliku audio po X czasie
	}, list[AudioIndex][1]);
};
0

Dziękuję.
Popatrz proszę na link http://samaia.pl/www-sound/sound_sequence-array.html (Twój kod).
Zmieniłem odstępy na "0" i zobacz, jaka długa jest przerwa.
A powinno jej nie być, bo pliki same w sobie są przycięte, nie ma w nich ciszy.
Ten skrypt ma więc swoje domyślne przerwy.
Nawet jak ustawię przerwy na "minus" w Twoim skrypcie, to nie działa.
Teraz popatrz na link http://samaia.pl/www-sound/sound_sequence.html :
Nie ma przerw, ale to robota głupiego, bo muszę znać długość pliku w ms
lub przynajmniej skrypt musi ją ustalić przed odtworzeniem następnego.
W ogóle dla mnie najlepszy byłby skrypt operujący listą utworów,
bo będzie on służył do odczytywania dowolnych liczb i kod będzie tworzony dynamicznie.

0

Trochę zmodyfikowany kod:

var audio = document.createElement('audio'); // Tworzymy obiekt AUDIO
var AudioIndex = 0;

var list = new Array();
list[0] = ["tysiac.mp3","0"];
list[1] = ["dziewiecset.mp3","0"];
list[2] = ["szescdziesiat.mp3","0"];
list[3] = ["jeden.mp3","0"]

//list[] = ["<-- plik mp3 -->","<-- czas w ms -->"];

audio.src=list[AudioIndex][0];
audio.preload = 'auto';
audio.play();

audio.onended = function() {
	console.log("Ended: "+AudioIndex);
	//audio.pause();
	AudioIndex++;
	
	if(AudioIndex > list.length-1) { // Sprawdzamy czy AudioIndex nie jest większę od liczby plików
        audio.stop(); // Zatrzymuję odtwarzanie
    }
	audio.src=list[AudioIndex][0];
	audio.preload = 'auto';
	audio.load();
	window.setTimeout(function() {
		audio.play();
	}, list[AudioIndex][1]);
};

Kod nie będzie działał na urządzeniach mobilnych.

Sprawdź to responsivevoice.org (język polski)

0

Dzięki.
Odstępy dalej takie same, jak były.

1 użytkowników online, w tym zalogowanych: 0, gości: 1