MediaRecorder:从多个麦克风录制

Eni*_*jar 3 javascript audio

我目前正在使用MediaRecorder API在应用程序中录制音频。

有没有办法从多个输入设备(例如两个麦克风)进行录音?

我可以使用的设备的列表mediaDevices.enumerateDevices(),这表现在这里

理想情况下,如果可能的话,我想选择两个或多个要记录的设备。

这可能吗?

Eni*_*jar 6

解决方案是请求多个getUserMedia流并将其与混合AudioContext

这是这样做的方法。

const VIDEO_ID = 'video_id';
const MIC_1_ID = 'mic_1_id';
const MIC_2_ID = 'mic_2_id';

// Request permission
navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(() => {

    // Loop over all available video and audio devices (input and output)
    navigator.mediaDevices.enumerateDevices().then(devices => {

        // Request exact devices
        const requests = [
            navigator.mediaDevices.getUserMedia({video: {deviceId: {exact: VIDEO_ID}}}),
            navigator.mediaDevices.getUserMedia({video: false, audio: {deviceId: {exact: MIC_1_ID}}}),
            navigator.mediaDevices.getUserMedia({video: false, audio: {deviceId: {exact: MIC_2_ID}}})
        ];

        // Wait for all device requests to resolve.
        Promise.all(requests).then(streams => {
            const ctx = new AudioContext();
            const dest = ctx.createMediaStreamDestination();

            // Connect streams to the destination audio stream.
            streams.map(stream => {
                ctx.createMediaStreamSource(stream).connect(dest);
            });

            const videoTrack = streams[0].getTracks()[0];
            const mixedTracks = dest.stream.getTracks()[0];

            // Combine video and audio tracks into single stream.
            const stream = new MediaStream([videoTrack, mixedTracks]);

            // Start recorder
            const recorder = new MediaRecorder(this.stream, this.settings.recorder);

            // ...
        });

    });
});
Run Code Online (Sandbox Code Playgroud)


小智 6

此功能会将您的曲目合并为一个:

function mix(audioContext, streams) {
  const dest = audioContext.createMediaStreamDestination();
  streams.forEach(stream => {
    const source = audioContext.createMediaStreamSource(stream);
    source.connect(dest);
  });
  return dest.stream.getTracks()[0];
}
Run Code Online (Sandbox Code Playgroud)