2017-11-09 9 views
0

iOS에서 동시에 여러 오디오 파일을 재생하고 싶습니다.Safari에서 여러 오디오 파일 재생 즉시

버튼을 클릭하면 오디오 파일의 여러 인스턴스를 만들어 배열에 넣을 수 있습니다.

possibleAudiosToPlay.forEach(el => { 
    el.currentTime = 0; 
    el.play(); 
}); 

이 모든 오디오 파일을 재생하는 동안은 : 새로운 시작되면 그것은 이전을 중지 잠시 후

let audio = new Audio('path.wav') 
audio.play().then(() => { 
    audio.pause(); 
    possibleAudiosToPlay.push(audio); 
}); 

내가 그들 모두를 재생할 수 있습니다. (iOS에서)

애플의 개발자 가이드는이 모든 HTML5 오디오와 수 없습니다 말한다 : 동시에 여러 개의 오디오 스트림을 재생

도 지원되지 않습니다.

웹 오디오 API를 사용하여이 작업을 수행 할 수 있습니까? Apple 개발자 가이드에 서면으로 작성된 내용이 없습니다.

답변

0

Web Audio API으로 할 수 있습니다. 각 소스는 한 번만 재생할 수 있으므로 오디오 소스마다 하나씩 AudioBufferSourceNode을 만들어야합니다 (멈추거나 다시 재생할 수는 없습니다).

const AudioContext = window.AudioContext || window.webkitAudioContext; 
const ctx = new AudioContext(); 
const audioPaths = [ 
    "path/to/audio_file1.wav", 
    "path/to/audio_file2.wav", 
    "path/to/audio_file3.wav" 
]; 
let promises = []; 


// utility function to load an audio file and resolve it as a decoded audio buffer 
function getBuffer(url, audioCtx) { 
    return new Promise((resolve, reject) => { 
     if (!url) { 
      reject("Missing url!"); 
      return; 
     } 

     if (!audioCtx) { 
      reject("Missing audio context!"); 
      return; 
     } 

     let xhr = new XMLHttpRequest(); 
     xhr.open("GET", url); 
     xhr.responseType = "arraybuffer"; 

     xhr.onload = function() { 
      let arrayBuffer = xhr.response; 
      audioCtx.decodeAudioData(arrayBuffer, decodedBuffer => { 
       resolve(decodedBuffer); 
      }); 
     }; 

     xhr.onerror = function() { 
      reject("An error occurred."); 
     }; 

     xhr.send(); 
    }); 
} 


audioPaths.forEach(p => { 
    promises.push(getBuffer(p, ctx)); 
}); 


// Once all your sounds are loaded, create an AudioBufferSource for each one and start sound 
Promise.all(promises).then(buffers => { 
    buffers.forEach(b => { 
     let source = ctx.createBufferSource(); 
     source.buffer = b; 
     source.connect(ctx.destination); 
     source.start(); 
    }) 
});