Skip to content

Bottom of video cut off when specifying an exact width/height using headless : chrome and google-chrome-stable #122

Open
@ericlucit

Description

@ericlucit
  • I'm submitting a ...
    [x] bug report
    [ ] feature request
    [ ] question about the decisions made in the repository
    [ ] question about how to use this project

  • Summary
    I am attempting to render video files at an exact resolution (width x height). During this process I load a URL that has content within it set to 100% screen width and height (using css properties 100vw and 100vh - When viewing this content in a browser, it is always perfect.

I discovered that when setting my heights and widths to exactly what I want 1920x1080 the bottom of the video was being cut off

However, when I ADD 139 pixels (exactly) to the height of the window size, then, it is perfect.

Even more surprising (and for the general case. if I set the height to some VERY large multiple (eg. 108000) it will also then render perfectly

Here is what should be a reproduceable set of code

I am using the following image with a 10px border around it
image

const width=1920;
const height=1080;

const browser = await puppeteer.launch({
    executablePath: '/usr/bin/google-chrome-stable',
    headless: 'chrome', // new headless mode can support GPU
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-software-rasterizer', 
      '--enable-gpu-rasterization',
      '--ignore-gpu-blocklist',
      '--use-gl=gpu',
      '--window-size=' + width + ',' + height
    ],
  });

  await page.goto(url, { waitUntil: 'networkidle2' });

  const page = await browser.newPage();

  await page.setViewport({
    width: width,
    height: height,
    deviceScaleFactor: 2 // High DPI for crisper text and images
  });

  console.log('Initializing screen recorder');
  const recorder = new PuppeteerScreenRecorder(page, {
    followNewTab: true,
    fps: 30,
    videoFrame: {
      width: width,
      height: height,
    },
    videoCodec: 'libx264',
    videoCrf: 18,
    videoPreset: 'veryfast',
    videoBitrate: 8000,
    videoMute: true,
  });

This is the result - Note that the bottom of the image is cut off
image

If I add 139 pixels to the height, we get the right height

const browser = await puppeteer.launch({
    executablePath: '/usr/bin/google-chrome-stable',
    headless: 'chrome', // new headless mode can support GPU
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-software-rasterizer', 
      '--enable-gpu-rasterization',
      '--ignore-gpu-blocklist',
      '--use-gl=gpu',
      '--window-size=' + width + ',' + (height+139)
    ],
  });

image

And finally, making the height 100x the height, we get a good result as well

const browser = await puppeteer.launch({
    executablePath: '/usr/bin/google-chrome-stable',
    headless: 'chrome', // new headless mode can support GPU
    args: [
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-software-rasterizer', 
      '--enable-gpu-rasterization',
      '--ignore-gpu-blocklist',
      '--use-gl=gpu',
      '--window-size=' + width + ',' + (height*100)   //100 times the height!
    ],
  });
  • Other information (e.g. detailed explanation, stack traces, related issues, suggestions how to fix, links for us to have context, eg. StackOverflow, personal fork, etc.)

My thoughts are is that this is because of the toolbar in chrome using up 139 pixels

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions