可以获取 Puppeteer 音频源和/或直接向 Puppeteer 输入音频吗?

问题描述 投票:0回答:5

我想将 WAV 或 MP3 输入到 puppeteer 作为麦克风,但是在无头模式下应用程序被静音,所以我想知道是否有一种方法可以直接将输入输入到浏览器中。

我还想知道是否可以在无头模式下从浏览器获取音频源,和/或录制音频并将其放在文件夹中。

node.js puppeteer google-chrome-headless
5个回答
14
投票

我最终使用了这个解决方案。首先,我启用了 Chromium 的一些选项:

const browser = await puppeteer.launch({
  args: [
    '--use-fake-ui-for-media-stream',
  ],
  ignoreDefaultArgs: ['--mute-audio'],
});

如果 Chromium 已打开,请记住将其关闭。

我创建了一个

<audio>
元素,并将
src
设置为我想要输入的文件。我还覆盖了
navigator.mediaDevices.getUserMedia
,以便它返回与音频文件具有相同流的
Promise
,而不是来自麦克风。

const page = await browser.newPage();
await page.goto('http://example.com', {waitUntil: 'load'});
await page.evaluate(() => {
  var audio = document.createElement("audio");
  audio.setAttribute("src", "http://example.com/example.mp3");
  audio.setAttribute("crossorigin", "anonymous");
  audio.setAttribute("controls", "");
  audio.onplay = function() {
    var stream = audio.captureStream();
    navigator.mediaDevices.getUserMedia = async function() {
       return stream;
    };
  });
  document.querySelector("body").appendChild(audio);
});

现在每当网站的代码调用

navigator.mediaDevices.getUserMedia
时,它都会从文件中获取音频流。 (您需要先确保音频正在播放。)


4
投票

用户 Flimm 的第二个答案是正确的。不知道为什么这对他不起作用。在这里为其他人添加答案,因为我没有足够的声誉来评论他的答案。

const browser = await puppeteer.launch({ headless: true,
  args: [
    '--use-fake-ui-for-media-stream',
    '--use-fake-device-for-media-stream',
    '--use-file-for-fake-audio-capture=C:\\Users\\Username\\Desktop\\newtest.wav',
  ],

一个可能的原因可能是在 Windows 中,斜杠需要加倍,就像我在这里所做的那样。

还需要启用 --use-fake-device-for-media-stream 才能使其工作。

wav 文件应为 44.1 kHz、16 位。 这个示例对我有用。


2
投票

不确定作为麦克风输入是什么意思,但您可以在无头模式下启用音频。这应该有效:

const browser = await puppeteer.launch({
   ignoreDefaultArgs: ['--mute-audio']
});

1
投票

理论上,要加载文件

example.wav
并将其用作麦克风输入,这应该可行:

const browser = await puppeteer.launch({
  args: [
    '--use-fake-ui-for-media-stream',
    '--use-fake-device-for-media-stream',
    '--use-file-for-fake-audio-capture=/path/example.wav',
    '--allow-file-access',
  ],
  ignoreDefaultArgs: ['--mute-audio'],
});

我被告知在运行脚本之前需要确保 Chrome 已关闭,并且 .wav 文件需要为 41khz 和 16 位。

但是,我无法让它工作:(


0
投票

如何多次或在准确的时间向麦克风播放声音? 根据 Flimm 的回答,我只能在开始时播放声音一次,网站代码调用 getMediaDevices 函数。

我的问题是:在网站代码已经调用 getMediaDevices 函数之后,是否可以在任何给定时间向麦克风播放声音?

谢谢。

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