如何获取扬声器输出的媒体流以通过网络传输或录制?



我正试图获得扬声器的输出,然后用这个流做我想做的任何事情。

我试着用这个来获取演讲者的流:

var mySpeakerStream = new MediaStream();
navigator.mediaDevices.getUserMedia({audio: {deviceId : {exact: mySpeakerId} } }).then(s => {        
myStream.addTrack(s.getAudioTracks()[0]);
}).catch( console.log('failed') );

我本想得到扬声器,但我没有,然后我意识到getUserMedia方法只返回输入设备的MediaStream。有什么方法可以得到扬声器的输出流吗?

JavaScript媒体设备的行为与系统音频设备完全相同。如果你能够用Audacity(或任何录音机(之类的东西录制设备,你就可以使用媒体设备用JavaScript录制设备。

然而,访问扬声器的输出需要在计算机的操作系统上进行设置,这可能是出于安全等原因。

这可以通过在操作系统上创建音频环回设备来完成,但截至2019年10月,创建环回不能完全通过客户端JavaScript来完成。

经过更多思考,我发现:我可以使用getDisplyMedia方法,但是它不支持纯音频请求,所以我试图获得音频和视频流,然后我从中获得音轨,就像这样:

var speaker = new MediaStream;
if (navigator.getDisplayMedia) {
navigator.getDisplayMedia({
video: true ,
audio: true
}).then(stream => {
speaker.addTrack(stream.getAudioTracks()[0].clone());
// stopping and removing the video track to enhance the performance
stream.getVideoTracks()[0].stop();
stream.removeTrack(stream.getVideoTracks()[0]);
}).catch(() => {
console.error('failed')
});
} else if (navigator.mediaDevices.getDisplayMedia) {
navigator.mediaDevices.getDisplayMedia({
video: true ,
audio: true
}).then(stream => {
speaker.addTrack(stream.getAudioTracks()[0].clone());
// stopping and removing the video track to enhance the performance
stream.getVideoTracks()[0].stop();
stream.removeTrack(stream.getVideoTracks()[0]);
}).catch(() => {
console.error('failed')
});
}

我知道这并不能完全解决问题,但我认为这是有用的。

"仍在工作,等待更多解决方案">

最新更新