我目前正在使用MediaRecorder API在应用程序中录制音频。
有没有办法从多个输入设备(例如两个麦克风)进行录音?
我可以使用的设备的列表mediaDevices.enumerateDevices(),这表现在这里。
理想情况下,如果可能的话,我想选择两个或多个要记录的设备。
这可能吗?
解决方案是请求多个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)