Skip to content

Instantly share code, notes, and snippets.

@kenjiSpecial
Created July 27, 2020 09:17
Show Gist options
  • Save kenjiSpecial/54fbf9c872cc1f1c2a7a34a029494761 to your computer and use it in GitHub Desktop.
Save kenjiSpecial/54fbf9c872cc1f1c2a7a34a029494761 to your computer and use it in GitHub Desktop.
puppeteerでスクリーンキャプチャを実行する
//
'use strict';
const puppeteer = require('puppeteer');
const { spawn } = require('child_process');
const viewportWidth = 1280; //parseInt(process.argv[4]);
const viewportHeight = (viewportWidth * 9) / 16; //parseInt(process.argv[3]);
const fps = 30;
const ffmpegArgs = (fps) => [
'-y',
'-f',
'image2pipe',
'-r',
`${+fps}`,
'-i',
'-',
'-c:v',
'libx264',
'-auto-alt-ref',
'0',
'-pix_fmt',
'yuva420p',
'-metadata:s:v:0',
'alpha_mode="1"',
];
const write = (stream, buffer) =>
new Promise((resolve, reject) => {
stream.write(buffer, (error) => {
if (error) reject(error);
else resolve();
});
});
// ---------------
(async () => {
let options = {
pipeOutput: true,
output: 'output.mp4',
};
const ffmpegPath = 'ffmpeg';
const args = ffmpegArgs(fps);
const outfile = options.output;
args.push(outfile);
const ffmpeg = spawn(ffmpegPath, args);
if (options.pipeOutput) {
ffmpeg.stdout.pipe(process.stdout);
ffmpeg.stderr.pipe(process.stderr);
}
console.log('ffmpeg0');
const closed = new Promise((resolve, reject) => {
ffmpeg.on('error', reject);
ffmpeg.on('close', resolve);
});
console.log('ffmpeg1');
const browser = await puppeteer.launch({
headless: true,
// devtools: true,
defaultViewport: {
width: viewportWidth,
height: viewportHeight,
deviceScaleFactor: parseFloat(process.argv[5]),
},
});
const page = await browser.newPage();
await page.goto('http://localhost:1234/');
await page.evaluate(async () => {
await new Promise(function (resolve) {
setTimeout(resolve, 1000);
});
});
await page.evaluate(async () => {
window.simApp.initVideo();
});
for (let ii = 0; ii < 30 * 20; ii++) {
await page.evaluate(async () => {
window.simApp.updateVideo(1 / 30);
await window.simApp.loop();
});
let screenshot = await page.screenshot({
fullPage: false,
});
await write(ffmpeg.stdin, screenshot);
}
console.log('done!');
ffmpeg.stdin.end();
await closed;
await browser.close();
})();
{
"name": "packet-data-node",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"child_process": "^1.0.2",
"fluent-ffmpeg": "^2.1.2",
"puppeteer": "^5.2.0"
},
"scripts": {
"start": "node capture.js"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment