将 xpra 传输到 ffmpeg

将 xpra 传输到 ffmpeg

我正在尝试录制无头 xpra 显示器。(我尝试过 xvfb 和 Xdummy 选项)。

问题出在 ffmpeg 的“x11grab”上。使用的命令是:

/usr/bin/ffmpeg -y -framerate 2 -video_size 1920x1080 -f x11grab -i :102 -vcodec libx264 -crf 0 -preset ultrafast /output.mkv

问题是,这只会记录空白显示。除了 Linux 系统上可识别的黑色 X 外,其余全是白色。

Ffmpeg 可以很好地录制“真实”显示,我可以连接到 xpra 会话并看到显示中确实有窗口。此外,将 xwd 输出传输到 xwud 会显示相同的窗口。

我在这上面浪费了一整天的时间!有人知道我可以采取什么措施让 x11grab 正常工作吗?

答案1

Xpra 是合成窗口管理器, 我引用:窗口管理器将窗口缓冲区合成为代表屏幕的图像,并将结果写入显示内存。。在 xpra 情况下,显示内存位于客户端上,在您连接客户端之前它不存在,因此 vfb 上不会显示任何内容。这就是 xpra 的工作原理。

Xpra 有一个选项叫做同步-xvfb(以毫秒为单位)还可用于绘制虚拟屏幕,然后您可以将其捕获。它专门用于记录虚拟屏幕。

另一个较慢的选项是单独启动您的 vfb,然后xpra shadow通过 xpra 访问现有的 vfb。(xpra 阴影模式效率低得多……因为它不使用合成,而是使用像 x11grab 那样的屏幕抓取)

答案2

因此,经过深入研究后,我认为这与 xpra 管理其活动窗口的方式有关。

将 xwd 管道化到 xwud 需要我为 xwd 指定子窗口 ID,否则它只会显示一个空白窗口框架。从视觉上看,这与我从 ffmpeg 获得的空白白色框架非常不同,但我认为这表明了同一件事。

如果我不得不猜测这与飞机有关,证据是

 444  req->planeMask = (unsigned int)AllPlanes;
 445  req->format = ZPixmap;

^ x11grab 的 ffmpeg 代码,来自https://ffmpeg.org/doxygen/trunk/x11grab_8c_source.html

我决定放弃 xpra 并使用 xvfb 独立版。这样我就可以使用 ffmpeg

相关内容