让ffmpeg捕获xfvb-运行 screen 运行ning puppeteer脚本的全屏,并通过rtmp发送
Getting ffmpeg to capture the full screen of xfvb-run screen running puppeteer script, and send it over rtmp
我的问题
我无法获取 ffmpeg 或 xvfb-运行 将全屏流式传输到 ffplay/videolan,它只能捕获屏幕的一部分。
更新 2
我自己在后续回答中回答了这个问题,希望它对遇到同样问题的其他人有用。
更新 1
所以肯定是xvfb-运行的问题,因为下面的两个命令,还是给出了一个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"
我试过的
- 我试过更改 ffmpeg 命令和 xvfb-运行,例如添加“-vf format=yuv420p”或“-filter:v”crop=iw-400:ih-40,scale= 960:720" 到 ffmpeg 命令
- 我尝试在 xvfb-运行 下展示其他应用程序而不是 puppeteer (chrome..)
- 用ffmpeg录屏并保存到文件,看看是不是rtmp流有问题
但还是没有运气。这就是我联系 Whosebug 社区的原因。
xvfb-运行命令
xvfb-run -n 99 -a --server-args="-screen 0 1024x8000x24 -ac -nolisten tcp -dpi 96 +extension RANDR" "node index.js"
ffmpeg命令抓取xvfb-运行虚屏
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
木偶脚本(index.js) which xfvb-运行s
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()
所以我一直在调试,想办法解决。问题出在 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
我在 ffmpeg 命令后添加了 -video_size 640x1208
。
我在这个 Whosebug 答案中找到了 video_size 标志 -
我的问题
我无法获取 ffmpeg 或 xvfb-运行 将全屏流式传输到 ffplay/videolan,它只能捕获屏幕的一部分。
更新 2
我自己在后续回答中回答了这个问题,希望它对遇到同样问题的其他人有用。
更新 1
所以肯定是xvfb-运行的问题,因为下面的两个命令,还是给出了一个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"
我试过的
- 我试过更改 ffmpeg 命令和 xvfb-运行,例如添加“-vf format=yuv420p”或“-filter:v”crop=iw-400:ih-40,scale= 960:720" 到 ffmpeg 命令
- 我尝试在 xvfb-运行 下展示其他应用程序而不是 puppeteer (chrome..)
- 用ffmpeg录屏并保存到文件,看看是不是rtmp流有问题
但还是没有运气。这就是我联系 Whosebug 社区的原因。
xvfb-运行命令
xvfb-run -n 99 -a --server-args="-screen 0 1024x8000x24 -ac -nolisten tcp -dpi 96 +extension RANDR" "node index.js"
ffmpeg命令抓取xvfb-运行虚屏
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
木偶脚本(index.js) which xfvb-运行s
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()
所以我一直在调试,想办法解决。问题出在 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
我在 ffmpeg 命令后添加了 -video_size 640x1208
。
我在这个 Whosebug 答案中找到了 video_size 标志 -