2017-02-09 2 views
3

До сих пор я нашел способ записать только локальный или удаленный, используя MediaRecorder API, но можно ли смешивать и записывать оба пара и получать blob?WebRTC смешивает локальные и удаленные аудиопары и записывает

Обратите внимание только на его аудио пар, и я не хочу смешивать/записывать на стороне сервера.

У меня есть RTCPeerConnection как pc.

var local_stream = pc.getLocalStreams()[0]; 
var remote_stream = pc.getRemoteStreams()[0]; 
var audioChunks = []; 
var rec = new MediaRecorder(local_stream); 
rec.ondataavailable = e => { 
    audioChunks.push(e.data); 
    if (rec.state == "inactive") 
     // Play audio using new blob 
} 
rec.start(); 

Даже я попытался добавить несколько треков в MediaStream API, но она по-прежнему дает только первый аудио дорожки. Любая помощь или понимание будут оценены!

+0

@AdrianBer, мой вопрос отличается. Смешайте два аудиопотока и запишите их как один паровой объект. Таким образом, вы можете слышать разговор одной стороны в одном аудиоэлементе. И практически вы не можете смешивать два видеопотока и получать один поток для его просмотра. –

+0

Я отозвал свой голос. Фактически вы можете смешивать два видеопотока, см. Мой ответ здесь: http://stackoverflow.com/questions/40966322/is-it-possible-to-merge-2-webm-video-streams-into-one-stream-in -картина –

ответ

4

WebAudio API может сделать смешивание для вас. Рассмотрим этот код, если вы хотите, чтобы записать все звуковые дорожки в массиве audioTracks:

const ac = new AudioContext(); 

// WebAudio MediaStream sources only use the first track. 
const sources = audioTracks.map(t => ac.createMediaStreamSource(new MediaStream([t]))); 

// The destination will output one track of mixed audio. 
const dest = ac.createMediaStreamDestination(); 

// Mixing 
sources.forEach(s => s.connect(dest)); 

// Record 10s of mixed audio as an example 
const recorder = new MediaRecorder(dest.stream); 
recorder.start(); 
recorder.ondataavailable = e => console.log("Got data", e.data); 
recorder.onstop =() => console.log("stopped"); 
setTimeout(() => recorder.stop(), 10000);