【问题标题】:pipe screenshots from puppeteer to ffmpeg从 puppeteer 到 ffmpeg 的管道屏幕截图
【发布时间】:2019-06-17 22:11:05
【问题描述】:

我正在尝试将 puppeteer 生成的屏幕截图通过管道传输到 ffmpeg 进程以制作视频,而无需先写入中间文件。

从命令行,我知道 ffmpeg 有一个选项可以从标准输入的原始数据制作视频,例如这个工作:

cat img/*.png | ffmpeg -f image2pipe -i - output.mp4

我想得到基本相同的结果,但是直接从 puppeteer 发送数据到 ffmpeg 进程。这是我尝试通过管道从 puppeteer 向 ffmpeg 发送一些帧,但它不起作用。该程序甚至没有退出,我怀疑我在滥用管道或其他东西。我怎样才能让它正常工作?

const puppeteer = require("puppeteer");
const { spawn } = require("child_process");

async function main() {
    let browser = await puppeteer.launch({});
    let page = await browser.newPage();
    await page.goto("http://google.com");

    let ffmpeg = spawn("ffmpeg", ["-f", "image2pipe", "-i", "-", "output.mp4"], {
        stdio: ["pipe", process.stdout, process.stderr]
    });
    for (let i = 0; i < 10; i++) {
        let screenshot = await page.screenshot();
        ffmpeg.stdin.write(screenshot);
    }
    await browser.close();
}

main();

【问题讨论】:

  • 我不确定,但是截图是一个缓冲区,所以你需要将它转换成流,然后通过管道传输到ffmpeg。我会尝试:screenshotStream.pipe(ffmpeg.stdin) 并在这里从缓冲区创建流 stackoverflow.com/a/16044400/3309466
  • @Mei Zhang,对你有用吗?您是否成功录制了 puppeteer 过程中的视频?
  • 这个问题有什么解决办法吗?

标签: node.js puppeteer


【解决方案1】:

嘿,所以我从来没有这样的事情,但我查看了puppeteer docs。如果您没有指定保存路径,则不会保存到文件,如果您指定 base64,它会返回原始数据。也许您会将原始数据通过管道传输到 ffmpeg?

所以当你调用屏幕截图时,它会是这样的

let screenshot = await page.screenshot({
  encoding:'base64'
})

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多