您如何将许多音轨组合成一个mediaRecorder API?

时间:2019-03-14 14:40:34

标签: javascript webrtc mediarecorder web-audio-api

我想做一个录音,从不同的mediaStream对象(其中一些是远程的)获得多个音轨。使用getAudioTracks()方法,然后使用addTrack()将它们添加到mediaStream对象中。在将最后一个对象作为mediaRecorder的参数传递时,我意识到它仅记录位于位置[0]的音轨。这使我理解mediaRecorder能够按类型记录轨道,是否有任何方法可以将这些轨道合并为一个轨道,从而使用mediaRecorder正确记录它们?如果有可能的话,我将不胜感激任何页面,

2 个答案:

答案 0 :(得分:3)

我一直在与之抗争一段时间,花了我很长时间才意识到MediaStream只记录了我添加的第一首曲目。我的解决方案是让Web Audio API参与其中。本示例使用两个UserMedia(例如,麦克风和立体声混音)并将其合并。如您使用deviceId所示,UserMedia由其await navigator.mediaDevices.enumerateDevices()标识。

总结:

  • 创建一个AudioContext()
  • 使用navigator.mediaDevices.getUserMedia()
  • 获取媒体
  • 将这些作为流源添加到AudioContext
  • 创建AudioContext流目标对象
  • 将您的来源连接到这个单一目的地
  • 您的新MediaRecorder()将此目的地作为其MediaStream

现在,您可以记录自己喜欢的歌曲在唱歌时的歌声;)

const audioContext = new AudioContext();
audioParams_01 = {
    deviceId: "default",
}
audioParams_02 = {
    deviceId: "7079081697e1bb3596fad96a1410ef3de71d8ccffa419f4a5f75534c73dd16b5",
}

mediaStream_01 = await navigator.mediaDevices.getUserMedia({ audio: audioParams_01 });
mediaStream_02 = await navigator.mediaDevices.getUserMedia({ audio: audioParams_02 });

audioIn_01 = audioContext.createMediaStreamSource(mediaStream_01);
audioIn_02 = audioContext.createMediaStreamSource(mediaStream_02);

dest = audioContext.createMediaStreamDestination();

audioIn_01.connect(dest);
audioIn_02.connect(dest);

const recorder = new MediaRecorder(dest.stream);

chunks = [];

recorder.onstart = async (event) => {
    // your code here
}

recorder.ondataavailable = (event) => {       
    chunks.push(event.data); 
}

recorder.onstop = async (event) => {
    // your code here
}

答案 1 :(得分:0)

使用muazKhan构建的库完成操作,该库允许您合并流并将它们返回一个!

这非常简单!

https://github.com/muaz-khan/MultiStreamsMixer