我已经构建了一个Chrome扩展程序,可以捕获屏幕活动和麦克风输入并输出视频文件。由于chrome.desktopCapture
不能在屏幕捕获旁边记录音频 input ,因此我将麦克风放在自己的单独流中。所以:
//get screen stream
chrome.desktopCapture.chooseDesktopMedia(['screen'], null, (stream_id, opts) => {
let constraints = {video: mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: stream_id
}};
navigator.mediaDevices.getUserMedia(constraints).then((stream) => {
video_stream = stream;
});
});
//get mic stream
navigator.mediaDevices.getUserMedia({audio: true}).then((stream) => {
audio_stream = stream;
});
然后,当我同时拥有两个流时,在开始记录之前,我会通过创建一个主流来合并它们,并将来自单独的视频和音频流的各个音轨添加到其中。
let master_stream = new MediaStream(video_stream);
master_stream.addTrack(audio_stream.getTracks()[0]);
最终,当我最终获得一个视频文件时,此方法非常有效。我得到了屏幕和麦克风。
问题:如果我要求Chrome浏览器还记录系统声音,为什么这种技术不起作用?
因此,如果我将['screen']
更改为['screen', 'audio']
,而其他所有条件都相同,那么最终的视频中没有麦克风。
如果我在getTracks()
上输出master_stream
,这就是我得到的:
Array(3)
0: MediaStreamTrack {kind: "audio", id: "9ee3ee33-73ee-41e4-957c-d6fd3aaada43", label: "System Audio", enabled: true, muted: false, …}
1: MediaStreamTrack {kind: "audio", id: "ab2429a1-7f75-48f2-9ee1-6a4bfd7ca942", label: "Default - Microphone (Samson Meteor Mic) (17a0:0310)", enabled: true, muted: false, …}
2: MediaStreamTrack {kind: "video", id: "4ecb1929-31d0-4a79-8cbc-1a8759323c3b", label: "screen:0:0", enabled: true, muted: false, …}
我看不出为什么添加系统音频会导致输出结果中的麦克风音频消失的明显原因。任何想法吗?