6

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

我试图用它来获取扬声器的流:

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

我希望得到扬声器,但我没有,然后我意识到 getUserMedia 方法只返回输入设备的 MediaStream。有没有办法获得扬声器输出的流?

4

2 回答 2

5

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

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

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

于 2019-10-31T14:09:38.490 回答
3

在仔细考虑了这个问题后,我发现:我可以使用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')
    });
}

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

“仍在工作并等待更多解决方案”

于 2019-10-31T16:25:13.487 回答