Я пытался решить эту проблему часами, но безуспешно.Просматривал все похожие вопросы, задаваемые на stackoverflow, но ни одно из решений, похоже, не работает для меня.
У меня есть множество видео, которые я просматривал.Мне нужно подключить каждое видео к аудиоэлементу, чтобы быстро определить его продолжительность и точное время, когда оно появляется в списке воспроизведения.
То, что у меня изначально было, это:
// Set time in playlist for each video
for (let index=0; index<this.playlist.length; index++) {
var audio = document.getElementById('audio');
console.log('INDEX: ' + index);
self.playlist[index].timeInPlaylist = [];
self.playlist[index].duration = 0;
audio.setAttribute('src', self.playlist[index].bucketRef);
audio.addEventListener('canplaythrough', function(e){
videoDuration = Math.round(e.currentTarget.duration);
console.log("Duration of video number " + index + ": " +
videoDuration + " seconds");
self.playlist[index].duration = videoDuration;
self.playlist[index].timeInPlaylist[0] = playlistLength;
playlistLength = playlistLength + videoDuration;
self.playlist[index].timeInPlaylist[1] = playlistLength;
});
};
Запускэтот код оставлял индекс таким же, а на выходе была длина последнего видео в массиве, записанного 3 раза.Затем, покопавшись в ней, я понял, что мне нужен какой-то тип закрытия из-за добавления прослушивателей событий внутри цикла.Поэтому я провел небольшой рефакторинг и пришел к этой текущей версии:
function log(e, index) {
videoDuration = Math.round(e.currentTarget.duration);
console.log("Duration of video number " + index + ": " + videoDuration + " seconds");
self.playlist[index].duration = videoDuration;
self.playlist[index].timeInPlaylist[0] = playlistLength;
playlistLength = playlistLength + videoDuration;
self.playlist[index].timeInPlaylist[1] = playlistLength;
}
// Set time in playlist for each video
for (let index=0; index<this.playlist.length; index++) {
var audio = document.getElementById('audio');
console.log('INDEX: ' + index);
self.playlist[index].timeInPlaylist = [];
self.playlist[index].duration = 0;
audio.setAttribute('src', self.playlist[index].bucketRef);
debugger;
(function() {
var i = index;
audio.addEventListener("canplaythrough", function(e) { log(e, i); });
})();
};
Это решило мою проблему с индексами;однако, я все еще получаю только длительность последнего видео в массиве.
консольный вывод
Я был бы очень признателен за некоторые отзывы.Эта проблема убивает меня.