我正在尝试获取扬声器的输出,然后使用此流执行我想做的一切。
我试图使用它来获取发言人的信息流:
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')
});
}
我知道这不能完美解决问题,但我认为这很有用。
'仍在工作,等待更多解决方案'