我正在尝试遵循这些说明http://afterdesign.net/2016/02/07/recording-headless-selenium-tests-to-mp4.html用于记录硒测试。
但是,当我尝试使用该端口连接到 xvfb 时,我得到:
[x11grab @ 0x1e3b460] 无法打开显示 127.0.0.1:44,错误 1。127.0.0.1:44:输入/输出错误
我已将问题简化为:在一个窗口中:
xvfb-run --listen-tcp --server-num=44 --auth-file /tmp/xvfb.auth -s "-ac -screen 0 1920x1080x24" gedit
在另一个窗口中:
ffmpeg -f x11grab -video_size 1920x1080 -i 127.0.0.1:44 -codec:v libx264 -r 12 ~/test.mp4
得到
[x11grab @ 0x1e74460] Cannot open display 127.0.0.1:44, error 1.
127.0.0.1:44: Input/output error
这与 xvfb 未运行时得到的响应相同。
我在这里发现了一些听起来像这个问题的东西:https://bugzilla.redhat.com/show_bug.cgi?id=1340432然而,它说这个问题在版本 1 中已解决,我已经在版本 1.17 上,并且在 2:1.18.4-0ubuntu0.2 上。
有任何想法吗?
===更新===
在劳舍尔的回答之后,我将问题归结为:
当我在一个终端中执行此操作时:
$ Xvfb :44 -listen tcp -ac -screen 0 1920x1080x24
我在另一个终端中执行此操作:
$ xdpyinfo -display localhost:44 | head -n10
name of display: localhost:44
version number: 11.0
vendor string: The X.Org Foundation
vendor release number: 11804000
X.Org version: 1.18.4
maximum request size: 16777212 bytes
motion buffer size: 256
bitmap unit, bit order, padding: 32, LSBFirst, 32
image byte order: LSBFirst
number of supported pixmap formats: 6
另一方面,当我在一个终端中执行此操作时:
$ xvfb-run --listen-tcp --server-num=44 -s "-ac -screen 0 1920x1080x24" google-chrome --user-data-dir=/tmp
(或任何其他应用程序,例如硒测试)
我在另一个终端看到这个:
$ xdpyinfo -display localhost:44
xdpyinfo: unable to open display "localhost:44".
所以我有一个解决办法,但我仍然无法通过 tcp 连接到 xvfb-run
答案1
我对 Xvfb 的使用经验比对 xvfb-run 的经验丰富。您可以尝试直接运行Xvfb:
Xvfb :44 -auth /tmp/xvfb.auth -ac -screen 0 1920x1080x24
(Xvfb 默认侦听 tcp,您可以使用 禁用它-nolisten tcp
)
否则,问题可能出在使用 ip 127.0.0.1,也许它可以使用不同的 ip。我对此没有经验,但可以在/etc/hosts
.另外,任何由 提供的 IP 都ifconfig
应该有效。
答案2
造成全部差异的关键论点是-ac
Xvfb,它代表“禁用基于主机的访问控制机制”
--listen-tcp
如果您计划从另一台计算机访问 X 服务器,也将需要该文件。
因此,完整的示例xvfb-run
将是:
xvfb-run --listen-tcp -s "-ac" -- your_command
答案3
这对我有用:
xvfb-run -s ":99 -auth /tmp/xvfb.auth -ac -screen 0 1920x1080x24" ./run.sh & # launching xvfb in the background \
sleep 3 && # waiting for xvfb to be ready \
ffmpeg -y -f x11grab -video_size 1920x1080 -i :99 -codec:v libx264 -r 30 /tmp/test.mp4
所以整个事情就是将 server-num 直接传递给Xvfb
via-s
参数而不是使用--server-num
.不过我没有尝试过--listen-tcp
。
注意:完成Xvfb
后不要忘记杀死(例如)。ffmpeg
killall Xvfb