首页 > 解决方案 > 从 puppeteer 到 ffmpeg 的管道屏幕截图

问题描述

我正在尝试将 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();

标签: node.jspuppeteer

解决方案


Hey so I've never something like this but I checked out the puppeteer docs. If you don't specify a path to save to it won't save to file and if you specify base64 it returns the raw data. Maybe you'd pipe that raw data into ffmpeg?

So when you call screenshot it would be something like this

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

推荐阅读