是否可以直接向 Puppeteer 获取 Puppeteer 音频馈送和/或输入音频?

Posted

技术标签:

【中文标题】是否可以直接向 Puppeteer 获取 Puppeteer 音频馈送和/或输入音频?【英文标题】:Possible to Get Puppeteer Audio Feed and/or Input Audio Directly to Puppeteer? 【发布时间】:2019-02-27 02:16:21 【问题描述】:

我想将 WAV 或 MP3 作为麦克风输入 puppeteer,但是在 headless 中应用程序被静音,所以我想知道是否有办法直接将输入输入浏览器。

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

【问题讨论】:

抱歉,从这个问题中还不是很清楚——但是任务是什么?如果您只想从麦克风录制音频,为什么要使用 puppeteer? 另见:***.com/q/48264537/247696 另见:***.com/questions/52095416/… 【参考方案1】:

我最终使用了这个解决方案。首先,我为 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,它就会从文件中获取音频流。 (您需要确保先播放音频。)

【讨论】:

【参考方案2】:

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

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

【讨论】:

另外,您可能对此选项感兴趣:puppeteer.launch(args: [ '--use-fake-ui-for-media-stream' ])【参考方案3】:

用户 Flimm 的 second answer 在球上。不知道为什么它对他不起作用。在这里为其他人添加答案,因为我没有足够的声誉来评论他的答案。

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 位。 This sample one 为我工作。

【讨论】:

【参考方案4】:

理论上,要加载文件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 位。

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

【讨论】:

以上是关于是否可以直接向 Puppeteer 获取 Puppeteer 音频馈送和/或输入音频?的主要内容,如果未能解决你的问题,请参考以下文章

puppeteer设置cookie获取网页内容

puppeteer截图

实例:使用puppeteer headless方式抓取JS网页

使用 Puppeteer 获取 HTML 属性的值

以puppeteer抓取微指数,puppeteer基本示例,即docker部署

如何从 puppeteer 获取返回值? [复制]