Я использую кнопку mp3-плеера Soundmanager2 для воспроизведения ссылок на mp3-файлы на моем веб-сайте. Я использовал следующую модификацию, чтобы предварительно загрузить следующий mp3 во время воспроизведения текущего mp3.
play: function() {
sm.load('basicMP3Sound'+(1*this._data.oLink.title)+1);
//mycode end
pl.removeClass(this._data.oLink,this._data.className);
this._data.className = pl.css.sPlaying;
pl.addClass(this._data.oLink,this._data.className);
},
В приведенном выше примере вы можете заметить, что тег заголовка в this._data.oLink.title , который я добавил к ссылке mp3, позволяет упростить порядок файлов, например:
<a href="/quran/assets/audio/Menshawi_16kbps/002001.mp3" class="sm2_button" title="0">/002001.mp3</a>
Однако я заметил, что следующая ссылка на mp3 не загружается предварительно во время воспроизведения текущего mp3. Это связано с тем, что следующий mp3 не воспроизводится непрерывно или не начинает проигрываться после завершения воспроизведения своего предыдущего mp3. Другими словами, для загрузки требуется некоторое время или задержка.
Что-то не так в моем коде? или каковы ваши предложения?
Обратите внимание: демо этого слоя mp3 можно найти по этой ссылке < / а>
1 ответ
Изменить: подход к работе с встроенным проигрывателем кнопок SoundManager
В параметрах настройки в mp3-player-button.js
в разделе config
, где находится playNext : true|false
(строка 39), обновите его, чтобы он выглядел следующим образом:
...
this.config = {
// configuration options
playNext: true, // stop after one sound, or play through list until end
autoPlay: false, // start playing the first sound right away
preloadNext : true // preload next sound when previous sound starts to play
};
...
Затем под объектом this.events
(строка 96) измените функцию play
, чтобы предварительно загрузить следующий звук:
...
this.events = {
// handlers for sound events as they're started/stopped/played
play: function() {
pl.removeClass(this._data.oLink,this._data.className);
this._data.className = pl.css.sPlaying;
pl.addClass(this._data.oLink,this._data.className);
if (pl.config.preloadNext) {
var nextLink = (pl.indexByURL[this._data.oLink.id]+1);
if (nextLink<pl.links.length) {
sm.load(nextLink)
}
}
},
...
Таким образом, когда начинается песня, мы проверяем, есть ли следующая песня; если есть, мы извлекаем его id
из массива звуков, который был создан при создании экземпляра SoundManager. В данном случае SoundManager - это sm
, поэтому мы просто передаем id
нашей следующей песни в функцию sm.load()
.
Вот живая демонстрация: http://plnkr.co/edit/mpBkfDIrLNduMAWJjRfN.
Попробуйте такой подход:
Использование событий onplay
и onfinish
в createSound
метод, вы можете связать серию файлов, которые делегируют друг друга.
Явно сообщая firstSound
: "когда вы начинаете играть, предварительно загрузите следующий звук, а когда вы закончите играть, воспроизвести этот следующий звук"
JavaScript
var firstSound = soundManager.createSound({
id: 'firstSound',
url: 'path/to/your/firstSound.mp3'
});
var secondSound = soundManager.createSound({
id: 'secondSound',
url: 'path/to/your/secondSound.mp3'
});
// Kickoff first sound
firstSound.load();
// Define the chain of events
firstSound.play({
onplay: function () {
// When `firstSound` starts, preload `secondSound`
secondSound.load();
},
onfinish: function () {
// Repeat, with next sound
secondSound.play({...
})
}
});
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.