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

How to get a media stream of the speaker's output to transfer it over the network or record it?

我正在尝试获取扬声器的输出,然后用这个流做任何我想做的事。

我试图用它来获取演讲者的流:

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

我希望得到扬声器,但我没有,然后我意识到 getUserMedia 方法 returns 只是一个输入设备的 MediaStream。 有什么办法可以得到扬声器的输出流吗?

JavaScript 媒体设备的行为方式与系统音频设备完全相同。如果您能够在 Audacity(或任何录音机)之类的设备中录制设备,您将能够使用媒体设备在 JavaScript 中录制设备。

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

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

经过更多思考后,我发现: 我可以使用 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')
    });
}

我知道这不能完美解决问题,但我认为它很有用。

'still working and waiting for more solutions'