我正在尝试将文件中的音频播放到远程webrtc对等端。我可以让对等连接,麦克风音频在它们之间来回流动,没问题。但是,当我向远程对等体添加音频流时,来自流的音频不会在远程对等体系统上播放。
这是在Linux上使用Chrome 56用于本地系统,而Firefox 51用于远程用户。
文件加载到缓冲区中,我通过附加MediaRecorder并监视其ondataavailable()事件对此进行了测试,数据肯定会进入缓冲区并进入下面的source_dest。
以下是基本流程。我究竟做错了什么?
pc1 是已设置的localhost系统的AudioContext。下面的 mic_stream 是来自pc1的来自getUserMedia()的流,它获取本地麦克风。
// create a new stream source from the pc1 stream
mic_patch = pc1.context.createMediaStreamSource( mic_stream );
// create a new destination from the mic stream
source_dest = pc1.context.createMediaStreamDestination();
// create a new filter, we need this so that source_dest
// creates a stream that we can add to pc2.
biquadfilter = pc1.context.createBiquadFilter();
biquadfilter.type = 'highpass';
biquadfilter.frequency.value = 1500;
// connect the mic_patch to the filter
mic_patch.connect( biquadfilter );
// connect the filter to the new source dest
biquadfilter.connect( source_dest );
pc2 成功连接到pc1后,麦克风音频在pc1和pc2之间工作,一切都很好。然后我将source_dest流添加到pc2(RTCPeerConnection),当我通过pc2.getLocalStreams()检查pc2时,我看到source_dest流已连接。
pc2.addStream( source_dest.stream );
然后我将磁盘中的文件加载到缓冲区中。
此时,以下代码中的文件是使用HTML< input type =“file”>加载的File对象。领域。选择文件时会触发下面的代码。
我使用FileReader将其转换为AudioBuffer并使用连接到source_dest的createBufferSource()将其解码为缓冲区,因此buffer_source将其输出提供给source_dest,然后我立即通过buffer_source.start(0)开始播放
reader = new FileReader();
buffer_source = source_dest.context.createBufferSource();
buffer_source.connect( source_dest );
reader.onload = function(e) {
var arrayBuffer = reader.result;
Webcaster.node.context.decodeAudioData( arrayBuffer, function(buffer) {
buffer_source.buffer = buffer;
buffer_source.start(0);
/** For testing to ensure the buffer data makes it into source_dest
mediaRecorder = new MediaRecorder( source_dest.stream );
mediaRecorder.ondataavailable = function(evt) {
// push each chunk (blobs) in an array
chunks.push(evt.data);
// dump out the chunks array to ensure it receives buffer data successfully
console.log( 'CHUNKS', chunks );
};
mediaRecorder.start();
//stop recording after 10 seconds, no need to record longer,
//this is only to test the source_dest connect and data flow
//when recorders stop ondataavailable() will be triggered
setTimeout( function() { mediaRecorder.stop() }, 10000 )
**/
})
}
reader.readAsArrayBuffer( file );
所以这一切都有效,除了放入source_dest的音频数据不能在远程pc2上播放。我花了很多时间试图找出原因,到目前为止没有运气。
有人有线索为什么?