首页 > 解决方案 > 让 ffmpeg 捕获运行 puppeteer 脚本的 xfvb-run screen 的全屏,并通过 rtmp 发送

问题描述

我的问题

我无法让 ffmpeg 或 xvfb-run 将全屏流式传输到 ffplay/videolan,它只捕获屏幕的一部分。

更新 2

我自己在后续回答中回答了这个问题,希望它对遇到同样问题的其他人有用。

更新 1

所以问题肯定出在 xvfb-run 上,因为以下两个命令仍然给出一个 webm 文件,它只显示部分屏幕

ffmpeg -f x11grab -i :99 -g 50 -b:v 4000k -maxrate 4000k -bufsize 8000k -f webm -s 384x216 "blank.webm"

xvfb-run -n 99 -a --server-args="-screen 0 1024x8000x24 -ac -nolisten tcp -dpi 96 +extension RANDR" "node index.js"

我试过的

但仍然没有运气。这就是我联系 stackoverflow 社区的原因。

xvfb-运行命令

xvfb-run -n 99 -a --server-args="-screen 0 1024x8000x24 -ac -nolisten tcp -dpi 96 +extension RANDR" "node index.js"

ffmpeg 命令捕获 xvfb-run 虚拟屏幕

ffmpeg -f x11grab -i :99 -f pulse -i default -c:v libx264 -c:a aac -g 50 -b:v 4000k -maxrate 4000k -bufsize 8000k -f flv -listen 1 rtmp://localhost:4444/stream

最后显示 rtmp 流

ffplay -fflags -nobuffer -flags low_delay -probesize 32 -flags low_delay -analyzeduration 0 -i rtmp://localhost:4444/stream

xfvb 运行的 puppeteer 脚本 (index.js)



import puppeteer from 'puppeteer';
let initPuppeteer = async () => {
  const launchArgs = [
    //'--window-size=1280,1024',
    '--disable-web-security',
    '--disable-features=IsolateOrigins',
    '--disable-site-isolation-trials',
    '--app',
    '--kiosk',
  ]
  await puppeteer.launch({headless: false, ignoreDefaultArgs: ["--enable-automation"], args: launchArgs});
  const page = await this.browser.newPage();
  const device = puppeteer.devices['Nexus 10'];
  await page.emulate(device);
  await page.goto("https://google.com");
}
initPuppeteer()

标签: ffmpegpuppeteerxvfb

解决方案


所以我一直在调试并试图解决它。问题在于 ffmpeg 以及我添加标志的顺序。

自我注意:使用 ffmpeg 时,标志的顺序非常重要。

解决方案

ffmpeg -video_size 640x1208 -f x11grab -i :99 -c:v libx264 -c:a aac -g 50 -b:v 4000k -maxrate 4000k -bufsize 8000k -f flv -listen 1 rtmp://localhost:4444/stream

-video_size 640x1208在 ffmpeg 命令之后添加的位置。

我在这个 stackoverflow 答案中找到了 video_size 标志 - https://stackoverflow.com/a/32748769/337587


推荐阅读