【发布时间】: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 过程中的视频?
-
这个问题有什么解决办法吗?