THREE.Audio - получить currentTime и установить функциюEended - PullRequest
0 голосов
/ 03 ноября 2018

В моем приложении Three.js я разработал простой способ загрузки, воспроизведения и анализа аудио, который работает как на настольном, так и на мобильном устройстве. Необходимо использовать THREE.Audio, потому что HTML5 Audio Analyzer не работает на мобильных устройствах, вместо этого THREE.AudioAnalyser, да. Очень рад, кроме того, что я не могу найти способ:

  • получить текущее время воспроизведения звука
  • установить функцию onEnded

Вот код:

function soundLoad() {
listener = new THREE.AudioListener();
audio = new THREE.Audio( listener );
audioLoader = new THREE.AudioLoader();
analyser = new THREE.AudioAnalyser( audio, 32 );
audioLoader.load( 'audio/01.mp3', function( buffer ) {
    audio.setBuffer( buffer );
    audio.setLoop( false );
    audio.setVolume( 1 );
    (function readyToGo() {
        console.log(audio.buffer.duration); // yes it works
        document.getElementById('btnPlay').addEventListener( 'click', function(){
           audio.play(); 
           setInterval(function(){
             console.log(audio.context.currentTime); // starts counting from the loading, not from the actual play
             console.log(audio.buffer.currentTime); // doesnt' work
           }, 10);
        }, false);
        // audio.onEnded = function() { console.log(‘end’);}; 
        // audio.buffer.onEnded = function() { console.log(‘end’);};
        // audio.source.onEnded = function() { console.log(‘end’);}; //none of them works
    })();
});}

Надеемся, что есть решение для обеих проблем, без необходимости создания фактического ctx или других третьих частей. спасибо!

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Благодаря подсказкам Mugen87 я написал простые строки, которые получают то, что мне нужно - в функции рендеринга, поэтому проверил каждый кадр:

Декларация

var audioPrevTime, audioCurrentTime, data;

В функции рендеринга:

if (pause == 0){
    audioCurrentTime = audio.context.currentTime - audio.startTime + audioPrevTime;
    if (audioCurrentTime >= audio.buffer.duration){
        console.log('end song');
    }
    data = analyser.getAverageFrequency();
} else if (pause == 1){
    audioPrevTime = audioCurrentTime;
}

Все эти несколько строк позволяют загружать, воспроизводить, контролировать и анализировать звук как для настольных, так и для мобильных устройств (на устройствах, которые я до сих пор тестировал хорошо).

0 голосов
/ 03 ноября 2018

three.js не отображает события Web Audio, поэтому не рекомендуется перезаписывать AudioScheduledSourceNode.onended. Это может иметь неожиданные побочные эффекты. Если вам нужно текущее время аудио, вы должны рассчитать это значение самостоятельно. Попробуйте это:

const currentTime = audio.context.currentTime - audio.startTime;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...