You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用FFmpeg录制另一Docker容器中的XVFB虚拟屏幕

解决跨Docker容器录制XVFB虚拟屏幕的问题

问题根源

你主容器里的XVFB启动命令加了-nolisten tcp参数,直接禁用了TCP监听,导致其他容器无法连接到这个虚拟X服务器;同时X11的权限机制也会阻止跨容器的访问请求。

方案一:启用XVFB的TCP监听(简单直接)

  1. 修改主容器的XVFB启动命令,去掉-nolisten tcp并开启TCP监听:
Xvfb :99 -ac -screen 0 1920x1080x24 +extension RANDR -listen tcp &

注:原命令中-screen +extension RANDR格式有误,需指定屏幕编号(如-screen 0)后再添加扩展参数。

  1. 在主容器中开放X服务器访问权限(测试环境可用,生产环境建议限制特定IP):
xhost +
  1. 在FFmpeg容器中执行录制命令,用主容器名称或IP指定X服务器:
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i application_container_name:99+100,200 output.mp4

方案二:共享X11 Unix套接字(更安全)

  1. 主容器启动时,创建共享卷挂载X11套接字目录:
docker run -v x11-socket:/tmp/.X11-unix --name app-container ...

同时启动XVFB(保持默认Unix套接字即可,无需TCP监听):

Xvfb :99 -ac -screen 0 1920x1080x24 +extension RANDR &
  1. FFmpeg容器启动时挂载同一个共享卷,并设置DISPLAY环境变量:
docker run -v x11-socket:/tmp/.X11-unix -e DISPLAY=:99 --name ffmpeg-container ...
  1. 执行录制命令:
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :99+100,200 output.mp4

额外注意事项

  • 确保两个容器在同一个Docker网络下(默认bridge网络即可),这样容器名称可直接解析。
  • 若用TCP方式,主容器的5999端口(X11默认端口为6000+显示号)无需手动映射,只要容器间网络可达即可。

内容的提问来源于stack exchange,提问作者Maged Milad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:33:17