在 Puppeteer 中非常快速地播放渲染的 html 文件

发布于 2025-01-10 23:55:25 字数 1434 浏览 1 评论 0原文

我想将现有的 html 文件转换为视频文件。

为此,我使用 puppeteer 和我编写的算法获取屏幕截图并使用 ffmpeg 将其转换为视频。

该系统有效,但生成的视频在 1 秒内播放 HTML 文件中的 6 秒动画。

我找不到原因。

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

const myFunc = async () => {

    const browser = await puppeteer.launch(
        {
            headless: true
        }
    );

    const page = await browser.newPage();

    await page.goto(`file:${path.join(__dirname, 'index.html')}`,
        {
            waitUntil: 'networkidle0'
        });

    const args = [
        '-y', '-f',
        'image2pipe', '-r',
        '24', '-i',
        '-', '-c:v',
        'libvpx', '-auto-alt-ref',
        '0', '-pix_fmt',
        'yuva420p', '-metadata:s:v:0',
        'alpha_mode="1"', 'output3.webm'
    ];
    const ffmpeg = spawn('ffmpeg', args);

    const closed = new Promise((resolve, reject) => {
        ffmpeg.on('error', reject);
        ffmpeg.on('close', resolve);
    });

    for (let i = 1; i <= 24 * 6; i++) { // 6 Seconds
        let screenshot = await page.screenshot({ omitBackground: true });

        await write(ffmpeg.stdin, screenshot);
    }

    ffmpeg.stdin.end();

    await closed;
}

const write = (stream, buffer) =>
    new Promise((resolve, reject) => {
        stream.write(buffer, error => {
            if (error) reject(error);
            else resolve();
        });
    });

I want to convert an existing html file to a video file.

To do this, I use puppeteer and an algorithm I wrote takes screenshots and converts them to video with ffmpeg.

This system works, but the resulting video plays the 6-second animation in the HTML file in 1 second.

I couldn't find a reason why.

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

const myFunc = async () => {

    const browser = await puppeteer.launch(
        {
            headless: true
        }
    );

    const page = await browser.newPage();

    await page.goto(`file:${path.join(__dirname, 'index.html')}`,
        {
            waitUntil: 'networkidle0'
        });

    const args = [
        '-y', '-f',
        'image2pipe', '-r',
        '24', '-i',
        '-', '-c:v',
        'libvpx', '-auto-alt-ref',
        '0', '-pix_fmt',
        'yuva420p', '-metadata:s:v:0',
        'alpha_mode="1"', 'output3.webm'
    ];
    const ffmpeg = spawn('ffmpeg', args);

    const closed = new Promise((resolve, reject) => {
        ffmpeg.on('error', reject);
        ffmpeg.on('close', resolve);
    });

    for (let i = 1; i <= 24 * 6; i++) { // 6 Seconds
        let screenshot = await page.screenshot({ omitBackground: true });

        await write(ffmpeg.stdin, screenshot);
    }

    ffmpeg.stdin.end();

    await closed;
}

const write = (stream, buffer) =>
    new Promise((resolve, reject) => {
        stream.write(buffer, error => {
            if (error) reject(error);
            else resolve();
        });
    });

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文