如何获取扬声器输出的媒体流以通过网络传输或录制?
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'
我正在尝试获取扬声器的输出,然后用这个流做任何我想做的事。
我试图用它来获取演讲者的流:
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'