node.js - 从 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();
解决方案
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'
})
推荐阅读
- r - 如何将 4 行数据帧转换为 R 中的 2*2 矩阵?
- html - 如何在反应中的组件之间传递变量?
- python - 我可以获得已选择的文件名列表吗?
- sharepoint - 在 Salesforce 自定义组件中使用 MSAL.js (v2) 对用户进行身份验证
- sql - BigQuery 错误:无法解析正则表达式
- elixir - 我可以像在 Elixir 中关闭其他语言一样捕获块外的变量吗?
- xcode - Xcode 日志“编写分析的变体”
- ios - Safari Web Extension 后台请求 CORS 问题
- html - 导航栏链接移动到下一行的问题
- computer-vision - 在 3D 点云中定位 2D 图像