File size: 1,846 Bytes
119e586 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | /**
* Record demo.html as video using Puppeteer + FFmpeg
* Usage: node record-demo.mjs
*/
import puppeteer from 'puppeteer';
import { spawn } from 'child_process';
import fs from 'fs';
import path from 'path';
const WIDTH = 1280;
const HEIGHT = 800;
const FPS = 30;
const OUTPUT = 'docs/demo.mp4';
async function recordDemo() {
console.log('[Record] Starting demo video recording...');
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'],
});
const page = await browser.newPage();
await page.setViewport({ width: WIDTH, height: HEIGHT });
console.log('[Record] Loading demo.html...');
await page.goto(`file://${path.resolve('docs/demo.html')}`, {
waitUntil: 'networkidle2',
});
// Set up FFmpeg for video recording
const ffmpeg = spawn('ffmpeg', [
'-y',
'-f', 'gdigrab',
'-framerate', String(FPS),
'-i', 'desktop',
'-c:v', 'libx264',
'-preset', 'medium',
'-crf', '23',
'-pix_fmt', 'yuv420p',
OUTPUT,
]);
ffmpeg.stderr.on('data', (data) => {
console.log(`[FFmpeg] ${data}`);
});
// Wait for FFmpeg to start
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('[Record] Running demo sequence...');
// Click "Run Full Demo"
await page.click('button[onclick="runDemo()"]');
// Wait for demo to complete (~15 seconds)
await page.waitForTimeout(18000);
console.log('[Record] Stopping recording...');
ffmpeg.stdin.write('q');
await new Promise(resolve => {
ffmpeg.on('close', resolve);
});
await browser.close();
console.log(`[Record] ✓ Video saved: ${OUTPUT}`);
console.log(`[Record] Size: ${fs.statSync(OUTPUT).size / 1024 / 1024}MB`);
}
recordDemo().catch(console.error);
|