У меня есть аудиоплеер JavaScript с кнопками пропуска вперед / назад 10
секунд. Я делаю это, устанавливая currentTime
моего аудиоэлемента:
function Player(skipTime)
{
this.skipTime = skipTime;
this.waitLoad = false;
// initialise main narration audio
this.narration = new Audio(getFileName(dynamicNarration));
this.narration.preload = "auto";
this.narration.addEventListener('canplaythrough', () => { this.loaded(); });
this.narration.addEventListener('timeupdate', () => { this.seek(); });
this.narration.addEventListener('ended', () => { this.ended(); });
this.narration.addEventListener('waiting', () => { this.audioWaiting(); });
this.narration.addEventListener('playing', () => { this.loaded(); });
}
Player.prototype = {
rew: function rew()
{
if (!this.waitLoad) {
this.skip(-this.skipTime);
}
},
ffw: function ffw()
{
if (!this.waitLoad) {
this.skip(this.skipTime);
}
},
skip: function skip(amount)
{
const curTime = this.narration.currentTime;
const newTime = curTime + amount;
console.log(`Changing currentTime (${curTime}) to ${newTime}`);
this.narration.currentTime = newTime;
console.log(`Result: currentTime = ${this.narration.currentTime}`);
},
loaded: function loaded()
{
if (this.waitLoad) {
this.waitLoad = false;
playButton.removeClass('loading');
}
},
audioWaiting: function audioWaiting()
{
if (!this.waitLoad) {
this.waitLoad = true;
playButton.addClass('loading');
}
},
}
(я включаю сюда некоторых слушателей событий, которые я присоединяю, потому что ранее я отлаживал подобную проблему, связанную с конфликтами в слушателях событий. Хотя на этот раз я тщательно отладил прослушиватели событий, я не думаю в этом корень проблемы.)
Хотя все это отлично работает на моей локальной копии, когда я тестирую онлайн-версию, я получаю следующие результаты:
- Chrome: сбрасывает игровое положение до
0
. Конечная строка консоли гласит: currentTime = 0
.
- Safari: вообще не меняет игровую позицию. Последняя строка
console.log
дает значение для currentTime
, равное newTime
(даже при том, что позиция игры фактически не меняется).
- Firefox: пропуск вперед работ; Пропуск в обратном направлении прерывает звук на несколько секунд, затем он начинает воспроизводиться снова за пару секунд до того места, где была точка воспроизведения. В обоих случаях последняя строка console.log дает значение для
currentTime
, равное newTime
Проблема должна иметь отношение к способу загрузки звука. Я попытался добавить еще одну строку журнала консоли, чтобы показать начальное и конечное значения для buffered
.
В Chrome до 2
секунд после текущей позиции воспроизведения. В Safari он идет до ~170
секунд, а в Firefox, похоже, буферизует всю длину звука.
Однако в каждом случае начало объекта buffered
составляет 0
.
Кто-нибудь знает, что может быть не так?