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

问题描述 投票:3回答:2

我正在尝试获取扬声器的输出,然后使用此流执行我想做的一切。

我试图使用它来获取发言人的信息流:

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 media mediadevices
2个回答
3
投票

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

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.