我有以下代码尝试从我的 Windows 桌面上运行的特定应用程序捕获音频/视频:
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>Audio and Video</title>
</head>
<body>
<video autoplay></video>
<script type = "text/javascript">
var desktopCapturer = require('electron').desktopCapturer;
console.log("are you here?")
console.log(desktopCapturer)
desktopCapturer.getSources({ types: ['window', 'screen'] }).then(async sources => {
for (const source of sources) {
if (source.name === 'MyStreamingApp') {
try {
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
}
},
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720
}
}
})
handleStream(stream)
} catch (e) {
handleError(e)
}
return
}
}
})
function handleStream (stream) {
const video = document.querySelector('video')
video.srcObject = stream
video.onloadedmetadata = (e) => video.play()
}
function handleError (e) {
console.log(e)
}
</script>
</body>
</html>
当我运行它时,我可以听到音频......但当然我无法判断音频是来自原始 Windows 应用程序还是电子应用程序
问题
关于如何测试这个有什么建议吗?我如何向自己证明电子应用程序也在发送音频?例如,有没有办法“告诉”电子使用特定设备播放音频,而不仅仅是在计算机的默认扬声器/输出上播放音频?
我假设这是从正在运行的特定应用程序中捕获音频/视频的方法,而不是从系统扬声器中获取音频/视频。这个假设正确吗?
编辑 1
自发布以来,我梳理了本手册:
https://www.electronjs.org/docs/api/desktop-capturer?q=console.log
我更改了代码,因此对于音频,我没有指定源 ID,如下所示:
const stream = await navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: 'desktop',
//when capturing audio, need to remove the sourceid constraint.
//chromeMediaSourceId: source.id,
}
},
video: {
mandatory: {
chromeMediaSource: 'desktop',
chromeMediaSourceId: source.id,
minWidth: 1280,
maxWidth: 1280,
minHeight: 720,
maxHeight: 720
}
}
})
现在......当我启动电子应用程序并启动我的 av 应用程序时,电子应用程序会发送切碎的音频。它被严重破坏了,我什么都听不清……同时,我仍然可以听到源应用程序的音频。所以我想我已经证明它正在捕获一些音频......但它太糟糕了,它无法使用。
根据文档中的注释,它说在流式传输音频时不指定 sourceID 的事实,我猜您可以按原样使用电子从特定的 windows 应用程序获取音频。您只能请求整个桌面音频。但是如果有更多经验的人可以确认,那就太好了。
谢谢。