ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面:EGL 像素配置与窗口视觉不匹配的排查与修复

腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面:EGL 像素配置与窗口视觉不匹配的排查与修复 文章目录腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面EGL 像素配置与窗口视觉不匹配的排查与修复一、现象二、环境硬件软件三、先确认摄像头与系统权限没有问题四、从腾讯会议自己的日志定位失败点五、为什么它必须走 X11六、验证失败原因属性数组与最小复现七、结论八、修复只让腾讯会议使用 Mesa 的 EGL九、验证十、代价与遗留问题附录 A 最小复现程序附录 B 命令速查参考腾讯会议 Linux 版在 NVIDIA 显卡上看不到画面EGL 像素配置与窗口视觉不匹配的排查与修复记录日期 2026-10-06。摄像头本身工作正常采集、编码、上行都在跑腾讯会议界面里自己的画面却一直停在头像占位。查下来原因是腾讯会议的视频渲染器向 EGL 申请的像素配置带 8 位 alpha而它交给 EGL 的 X11 窗口是 24 位NVIDIA 的 EGL 实现严格校验这两者是否匹配于是创建窗口表面时每次都返回EGL_BAD_NATIVE_WINDOW。把腾讯会议单独固定到 Mesa 的 EGL 实现后画面恢复改动只有一个启动包装脚本加一个用户级桌面条目不需要 root随时可以撤销。EGL 是图形渲染接口Linux 上由 glvnd 在多个实现之间分发调用腾讯会议默认拿到的是 NVIDIA 的实现修复生效的关键就是让这一个进程改用 Mesa 的实现。一、现象会议进行中界面底部的摄像头按钮显示“停止视频”说明视频处于开启状态但自己的画面位只有一个头像。麦克风正常能听到对方说话对方也能看到我的画面腾讯会议的日志显示视频流一直在上传。出问题的只是我这边的窗口里没有画面。第一反应是摄像头坏了或者被别的程序占着后面的排查否定了这个方向。适用范围。本文的验证环境是 Ubuntu 26.04 配 GNOME 50 的 Wayland 会话、NVIDIA 专有驱动 595 系列、腾讯会议 3.26 版本。同类现象也可能出现在其他 Qt 或 Electron 应用以及别的 5xx 版驱动上判断依据是应用日志里创建 EGL 窗口表面失败并返回 0x3005。如果摄像头同时被别的程序占用表现是设备忙而不是画面缺失那属于另一类问题先按第三节的步骤确认设备本身。二、环境硬件部件型号与规格CPUAMD Ryzen Threadripper 9960X24 核 48 线程L3 缓存 128 MiB4 个 CCD单 NUMA 节点主板ASUS Pro WS TRX50-SAGE WIFI ARev 1.xxBIOSAmerican Megatrends 0617日期 2026-02-03内存装机容量 64 GB系统可用 61 GiBMemTotal: 63858056 kB。DIMM 频率与通道需要 root 读dmidecode -t memory本文未采集显卡NVIDIA GeForce RTX 3090GA102显存 24 GiBVBIOS94.02.26.80.80显示器DisplayPort 3840×2160HDMI 2560×1440存储Predator SSD GM9 2 TBnvme0n1、ZHITAI Ti600 1 TBnvme1n1PCIea9:00.0、WDC WD10SDRW 931 GBUSBsdaUSB 控制器AMD Turin USB 3.1 xHCI 两个21:00.4、f1:00.4、ASMedia ASM4242 USB4 两个a7:00.0、a8:00.0、600 系芯片组 USB 3.2b0:00.0网络Aquantia AQC113 10Genp173s0ad:00.0链路未连接、Intel I226-LMenp174s0ae:00.0链路未连接、Wi-Fiwlp175s0af:00.0。实际上网走 USB 网卡enx5c7daecbc30dMAC5c:7d:ae:cb:c3:0d地址 192.168.0.34默认路由摄像头UGREEN CameraUSB ID0c45:2283UVC 1.00接在3-1端口链路速率为高速USB 2.0480 Mbps。所以 1080p 只能走 MJPEG 格式YUYV 在 1080p30 下带宽不够音频UGREEN CM564 USB Audio2b89:0234麦克风、Focusrite Scarlett Solo 3rd Gen1235:8211耳机输出键鼠Logitech G102/G203摄像头暴露的采集格式ffmpeg -f v4l2 -list_formats all -i /dev/video0mjpeg : 1920x1080 1440x1080 1280x960 1280x720 1024x768 800x600 640x480 320x240 yuyv422: 1920x1080 1440x1080 1280x960 1280x720 1024x768 800x600 640x480 320x240/dev/video0是采集节点/dev/video1是 UVC 的元数据节点。后者不支持内存映射打不开属于正常现象。软件组件版本操作系统Ubuntu 26.04.1 LTSResolute Raccoon内核7.0.0-38-generic桌面GNOME Shell 50.1Wayland 会话XDG_SESSION_TYPEwayland音频服务PipeWire 1.6.2NVIDIA 驱动595.91.07Open Kernel Moduleglvnd 1.7.0Mesa26.0.8libegl-mesa0、libgl1-mesa-dri、libglx-mesa0腾讯会议wemeet3.26.10.401自带 Qt 5.15.8运行平台启动脚本强制到 X11QT_QPA_PLATFORMxcb、WEMEET_XWAYLAND1、DISPLAY:0也就是 XWayland这里引用的 X11 术语 visual 指窗口的像素格式与颜色布局EGL 里对应的属性是EGL_NATIVE_VISUAL_ID。后文提到视觉指的都是它。腾讯会议启动脚本/opt/wemeet/wemeetapp.sh中这一段是理解后面所有现象的起点if[$XDG_SESSION_TYPEwayland];thenif[-f/opt/x11-wayland/x11-ext.sh];thensource/opt/x11-wayland/x11-ext.shelseexportQT_QPA_PLATFORMxcbexportXDG_SESSION_TYPEx11unsetWAYLAND_DISPLAYexportWEMEET_XWAYLAND1fifi本机没有/opt/x11-wayland/x11-ext.sh因此腾讯会议始终以 XWayland 客户端的身份运行。这不是配置失误它的视频渲染器只支持 X11见第五节。三、先确认摄像头与系统权限没有问题设备节点存在权限由 logind 按活动会话发放 ACL当前用户有读写权限。$ ls -l /dev/video* crw-rw---- 1 root video 81, 0 Oct 6 09:42 /dev/video0 crw-rw---- 1 root video 81, 1 Oct 6 09:42 /dev/video1 $ getfacl -p /dev/video0 user::rw- user:ouyangjiahong:rw- group::rw- mask::rw- other::---内核驱动识别正常GNOME 的摄像头总开关也是打开的。$ journalctl -k -b | grep -i uvc uvcvideo 3-1:1.0: Found UVC 1.00 device UGREEN Camera (0c45:2283) $ gsettings get org.gnome.desktop.privacy disable-camera false会议进行时直接抓一帧会被拒绝因为设备已被会议占用。这同时也是摄像头正在工作的旁证。$ ffmpeg -f v4l2 -input_format mjpeg -video_size 640x480 -i /dev/video0 -frames:v 1 out.jpg [in#0] Error opening input: Device or resource busy $ fuser -v /dev/video* /dev/video0: ouyangjiahong 2486899 F...m wemeetapp /dev/video1: ouyangjiahong 2486899 F.... wemeetapp到这一步可以确定设备、驱动、权限、占用状态都正常问题出在腾讯会议自身。四、从腾讯会议自己的日志定位失败点腾讯会议的媒体引擎会把日志写到~/.local/share/wemeetapp/Saas/Logs/。其中xcast_年月日时.log记录采集、编码、渲染和网络wmp_年月日时.log是主程序的二进制日志不可读。先看采集与发送的统计$ grep -a Snd\[big Cap xcast_2026100615.log | tail -1 Snd[big Cap:1280x72028.5/7.49/1/5 HW:0 Enc:1280x72028.5/7.36 eType:5 eBR:1642.3/1369.0/249.9 CoBR:1554.4/1327.4/1500.0/1227.3 ... Fill:0 Mut:0 In:28.5 Skp:0.0 Drp:0.0/0Cap:1280x72028.5表示摄像头稳定输出每秒 28.5 帧Drp:0.0/0表示没有丢帧编码与上行同样正常。异常全部集中在渲染一侧$ grep -c enter create_window_surface xcast_2026100615.log 44 $ grep -c EGL_NO_SURFACE xcast_2026100615.log 44 $ grep -c create_window_surface succeeded xcast_2026100615.log 0 $ grep -a EGL_NO_SURFACE xcast_2026100615.log | head -2 15:39:57.611|W|egl_core.cc:184|25F2E2|eglCreateWindowSurface returned EGL_NO_SURFACE error:3005 15:39:57.627|W|egl_core.cc:184|25F2E2|eglCreateWindowSurface returned EGL_NO_SURFACE error:3005 $ grep -aoE render\.avg\.fps\.[0-9.] xcast_2026100615.log | sort | uniq -c 1 render.avg.fps.0.03. 1 render.avg.fps.0.21. 1 render.avg.fps.0.18.三个数字就说明了问题。创建 EGL 窗口表面尝试 44 次失败 44 次成功 0 次。错误码0x3005是EGL_BAD_NATIVE_WINDOW。渲染帧率停在每秒 0.03 到 0.21 帧而要显示 720p 视频本应接近 28 帧。渲染器拿不到任何可用表面界面只能退回头像占位。再翻三天前10 月 3 日那一次会话的日志同样是成功 0 次渲染帧率 0.00 到 0.50 帧。这是长期存在的环境性故障不是偶发。日志里还能看到这个渲染器属于哪个组件UGREEN Camera: UGREEN Camera add device:device.video-renderer.default renderer-dispatcher 1 DVC|renderer-dispatcher start 1 cookie:0x3d9a72f0 run:0五、为什么它必须走 X11看一眼libxcast.so里未定义的符号就能知道这个渲染器依赖哪个平台。$ nm -D --undefined-only /opt/wemeet/lib/libxcast.so | grep -iE egl|wl_|xcb|X[A-Z] U eglChooseConfig U eglCreateContext U eglCreatePbufferSurface U eglCreateWindowSurface U eglGetDisplay U eglMakeCurrent U eglSwapBuffers U XCreateGC U XGetWindowAttributes U XGetWindowProperty U XShmCreatePixmap符号表里只有 X11Xlib 与 XShm和 EGL没有任何与wl_surface、wl_egl_window相关的符号。所以让腾讯会议改用原生 Wayland 来绕开 XWayland 这条路走不通即便把 Qt 切到wayland平台插件媒体渲染器仍然需要一个 X 窗口句柄。egl_core.cc的日志格式同样在说明它想做什么enter create_window_surface eglCreateWindowSurface returned EGL_NO_SURFACE error:%x create_window_surface succeeded, egl_surface[%p]失败的正是由 X 窗口句柄创建 EGL 窗口表面这一步。六、验证失败原因属性数组与最小复现EGL_BAD_NATIVE_WINDOW最常见的成因是 EGL 像素配置所对应的 visual 与窗口自身的 visual 不一致。要验证这一点先得知道腾讯会议申请的像素配置是什么。libxcast.so没有被 strip直接反汇编eglChooseConfig的调用点可以看到属性数组是从.rodata整块搬移到栈上的$ objdump -d --no-show-raw-insn /opt/wemeet/lib/libxcast.so | grep -B20 call.*eglChooseConfig 2a5df0: movaps 0xecbca9(%rip),%xmm0 # 1171aa0 2a5df7: movaps %xmm0,-0x60(%rbp) ... 2a5e54: call cf120 eglChooseConfigplt把.rodata中0x1171a60起的 128 字节按整数解出来得到完整的属性表0 0x303f CONFORMANT ... 2 0x3020 BUFFER_SIZE 32 要 32 位 4 0x3024 RED_SIZE 8 6 0x3023 GREEN_SIZE 8 8 0x3022 BLUE_SIZE 8 10 0x3021 ALPHA_SIZE 8 还要 alpha 12 0x3025 DEPTH_SIZE -1 14 0x3026 STENCIL_SIZE -1 16 0x3032 SAMPLE_BUFFERS 0 18 0x3031 SAMPLES 0 20 0x3033 SURFACE_TYPE 4 EGL_WINDOW_BIT 22 0x3040 RENDERABLE_TYPE 4 EGL_OPENGL_ES2_BIT 24 0x3038 NONE腾讯会议要的是EGL_BUFFER_SIZE32加EGL_ALPHA_SIZE8的配置也就是 ARGB 视觉。再看它交给 EGL 的那个窗口$ xdotool search --name 腾讯会议 | head -2 29360170 29360204 $ DISPLAY:0 xwininfo -id 29360170 | grep -E Depth|Visual|Map State Width: 1444 Height: 964 Depth: 24 Visual: 0x2fd Map State: IsViewableQt 创建的 X11 窗口深度是 24 位。32 位配置配上 24 位窗口两者不匹配。到这里假设成立但还需要一次独立的验证。写一个最小复现程序只保留这条调用链用gcc t.c -lX11 -lEGL编译完整源码见附录 AEGLint attrs[]{EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,EGL_RED_SIZE,8,EGL_GREEN_SIZE,8,EGL_BLUE_SIZE,8,EGL_ALPHA_SIZE,8,EGL_NONE};eglChooseConfig(dpy,attrs,cfg,1,n);Window winXCreateWindow(...,DefaultVisual(dpy,scr),...);EGLSurface seglCreateWindowSurface(dpy,cfg,(EGLNativeWindowType)win,NULL);四种组合各跑一遍EGL 实现配置的 visual窗口的 visual结果NVIDIA0x91alpha 为 8缓冲 32 位0x61深度 24失败error0x3005NVIDIA0x910x91深度 32成功Mesa0x61alpha 为 80x61深度 24成功MesaLIBGL_ALWAYS_SOFTWARE10x610x61成功结论有两条。第一NVIDIA 的 EGL 严格检查配置的 visual 是否等于窗口的 visual不等就返回EGL_BAD_NATIVE_WINDOW。第二Mesa 的 EGL 对此宽松同样输入能顺利创建窗口表面。这也解释了同一个版本的腾讯会议为什么挑机器。在 Intel 与 AMD 核显的机器上走的是 Mesa画面一切正常唯独 NVIDIA 上黑屏差别不在摄像头兼容性而在 EGL 实现的严格程度。七、结论把整条链条写成因果顺序是这样的。启动脚本检测到 Wayland 会话且找不到它的 X11 辅助脚本于是把腾讯会议放到 XWayland 上运行。Qt 因此创建深度 24 位的 X11 窗口。libxcast向 EGL 申请带 8 位 alpha 的 32 位配置。NVIDIA 的 EGL 认为这个组合非法创建窗口表面时返回EGL_BAD_NATIVE_WINDOW44 次全部失败。视频渲染器没有表面可用渲染帧率停在每秒零点几帧界面只能显示头像。采集、编码、上行与这条链路无关所以一切正常。一句话概括摄像头把画面交给了腾讯会议腾讯会议把它交给了 EGLEGL 因为一个 8 位的 alpha 通道拒绝了它。八、修复只让腾讯会议使用 Mesa 的 EGL__EGL_VENDOR_LIBRARY_FILENAMES和LIBGL_ALWAYS_SOFTWARE会影响所有进程包括桌面本身所以这里用启动包装脚本加用户级桌面条目把影响限制在腾讯会议内部不需要 root。包装脚本~/.local/bin/wemeet-mesa-egl#!/bin/sh# 只对腾讯会议固定 Mesa EGL# NVIDIA EGL 对 32 位 alpha 配置配 24 位窗口返回 EGL_BAD_NATIVE_WINDOW(0x3005)# Mesa EGL 容忍这一不匹配视频渲染器才能拿到窗口表面。export__EGL_VENDOR_LIBRARY_FILENAMES/usr/share/glvnd/egl_vendor.d/50_mesa.jsonexportLIBGL_ALWAYS_SOFTWARE1exec/opt/wemeet/wemeetapp.sh$$ chmod x ~/.local/bin/wemeet-mesa-egl桌面条目~/.local/share/applications/wemeetapp.desktop。文件名即桌面条目 ID与/usr/share/applications/wemeetapp.desktop保持一致用户级目录优先级更高菜单、Dock 与wemeet://入会链接都会走包装脚本[Desktop Entry] NameWemeetApp Name[zh_CN]腾讯会议 Exec/home/ouyangjiahong/.local/bin/wemeet-mesa-egl %u Icon/opt/wemeet/wemeet.svg TypeApplication Terminalfalse CategoriesAudioVideo; MimeTypex-scheme-handler/wemeet;$ update-desktop-database ~/.local/share/applications $ grep wemeet ~/.local/share/applications/mimeinfo.cache x-scheme-handler/wemeetwemeetapp.desktop;撤销改动只需删掉这两个文件并刷新一次数据库$ rm ~/.local/bin/wemeet-mesa-egl ~/.local/share/applications/wemeetapp.desktop $ update-desktop-database ~/.local/share/applications被否决的做法做法结论让腾讯会议以原生 Wayland 运行QT_QPA_PLATFORMwayland不可行。libxcast只引用 X11 与 EGL 符号需要 X 窗口句柄见第五节只设LIBGL_ALWAYS_SOFTWARE1无效。EGL 实现的选择由 glvnd 决定实测进程内加载的仍然是 NVIDIA 的 EGL改 GLX 相关变量如LIBGL_ALWAYS_INDIRECT、__GLX_VENDOR_LIBRARY_NAME未实测。这些变量作用于 GLX腾讯会议走的是 EGL不应对它生效等腾讯修复这是它自身的问题但周期不可控九、验证修复后的环境是否真的生效可以直接读运行中进程的判断依据$ tr \0 \n /proc/2749569/environ | grep -E EGL_VENDOR|LIBGL_ALWAYS __EGL_VENDOR_LIBRARY_FILENAMES/usr/share/glvnd/egl_vendor.d/50_mesa.json LIBGL_ALWAYS_SOFTWARE1 $ grep -aoE libEGL[^ ]*\.so[^ ]* /proc/2749569/maps | sort -u /usr/lib/x86_64-linux-gnu/libEGL.so.1.1.0 /usr/lib/x86_64-linux-gnu/libEGL_mesa.so.0.0.0 /usr/lib/x86_64-linux-gnu/libgallium-26.0.8-1ubuntu0.3.so $ grep -ac libEGL_nvidia /proc/2749569/maps 0进程只加载了 Mesa 的 EGL 与 Mesa 的 Gallium 驱动框架libgallium软件光栅化 llvmpipe 就在其中NVIDIA 的 EGL 一个也没有加载。媒体引擎侧的变化$ grep -c EGL_NO_SURFACE xcast_2026100616.log 0 $ grep -c create_window_surface succeeded xcast_2026100616.log 3 $ grep -a create_window_surface succeeded xcast_2026100616.log 16:22:08.629|I|egl_core.cc:186|29F502|create_window_surface succeeded, egl_surface[0x704a15ee8fe0] 16:22:08.646|I|egl_core.cc:186|29F502|create_window_surface succeeded, egl_surface[0x704a15eed720] 16:22:08.694|I|egl_core.cc:186|29F502|create_window_surface succeeded, egl_surface[0x704a15ee8fe0] $ grep -aoE render\.avg\.fps\.[0-9.] xcast_2026100616.log | sort | uniq -c 1 render.avg.fps.12.69. 1 render.avg.fps.28.64.修复前后的对比指标修复前修复后创建窗口表面成功次数0共尝试 44 次3共尝试 3 次EGL_NO_SURFACE error:3005次数440render.avg.fps0.03、0.18、0.2112.69、28.64界面表现只有头像实时画面界面本身也可以直接取证。腾讯会议是 XWayland 客户端它的窗口在 X 一侧真实存在可以用xwd把窗口内容抠出来。GNOME 50 已经禁止了org.gnome.Shell.Screenshot的 D-Bus 调用返回AccessDenied: Screenshot is not allowed这条路走不通。$ DISPLAY:0 xdotool search --name 腾讯会议 29360180 $ DISPLAY:0 xwd -id 29360180 -silent -out win.xwd $ ffmpeg -i win.xwd win.png修复前抓到的窗口按钮写着“停止视频”自己的画面位是一个头像。修复后同样的窗口里是我坐在摄像头前的实时画面对方仍然是头像因为对方没有开摄像头。十、代价与遗留问题软渲染的代价。LIBGL_ALWAYS_SOFTWARE1让腾讯会议的视频合成退到 Mesa 的软件光栅化。720p 的合成量对 24 核的 9960X 可以忽略渲染帧率稳定在 28 帧以上代价是不再吃 GPU。若日后想换回硬件路径删掉LIBGL_ALWAYS_SOFTWARE1只留厂商变量也可以Mesa 在 NVIDIA 上没有对应的 DRI 驱动多半会自行退回软件路径并打印egl: failed to create dri2 screen警告。采集侧的队列饥饿。整个会话里持续出现下面三条警告采集期间大致每秒一到两条本文这次会话有 225 条10 月 3 日那次会话累计 2084 条。E|v4l2.c:320|Not enough buffer on device:/dev/video0 E|v4l2.c:333|Could not requeue buffer on device:/dev/video0 W|video_capture_linux.c:416|camera[...].is.busy它不影响画面显示但说明采集线程的缓冲区回收存在问题。如果日后远端反馈我的画面卡顿这是第一个需要复查的地方。给腾讯的建议。libxcast把EGL_ALPHA_SIZE8与EGL_BUFFER_SIZE32写死在属性数组里却不去保证窗口的 visual 与之匹配。去掉 alpha 需求或者按EGL_NATIVE_VISUAL_ID创建匹配的窗口或者在创建窗口表面失败时退回无 alpha 的配置重试任一种改法都能让 NVIDIA 用户不再遇到这个问题。方法本身的适用范围。这套排查路径对任何 Qt 或 Electron 类应用的黑屏、视频不渲染都适用步骤是先确认数据源正常再在应用日志里找 EGL 创建窗口表面失败然后用一个最小程序验证配置与窗口视觉是否匹配最后按应用固定 EGL 实现。附录 A 最小复现程序// gcc eglvis.c -o eglvis -lX11 -lEGL// ./eglvis plain alpha 24 位窗口配 32 位 alpha 配置NVIDIA 下返回 0x3005// ./eglvis match alpha 32 位窗口配 32 位 alpha 配置可以通过#includestdio.h#includestdlib.h#includestring.h#includeX11/Xlib.h#includeX11/Xutil.h#includeEGL/egl.hintmain(intargc,char**argv){intmatchargc1!strcmp(argv[1],match);intwant_alphaargc2!strcmp(argv[2],alpha);Display*dpyXOpenDisplay(NULL);if(!dpy){puts(XOpenDisplay FAILED);return1;}intscrDefaultScreen(dpy);EGLDisplay edpyeglGetDisplay((EGLNativeDisplayType)dpy);EGLint major,minor;if(edpyEGL_NO_DISPLAY||!eglInitialize(edpy,major,minor)){printf(EGL init FAILED 0x%x\n,eglGetError());return1;}EGLint attrs[]{EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,EGL_RED_SIZE,8,EGL_GREEN_SIZE,8,EGL_BLUE_SIZE,8,want_alpha?EGL_ALPHA_SIZE:EGL_NONE,want_alpha?8:0,EGL_NONE};EGLConfig cfgs[64];EGLint n0;if(!eglChooseConfig(edpy,attrs,cfgs,64,n)||n1){printf(no config 0x%x\n,eglGetError());return1;}EGLConfig cfgcfgs[0];EGLint vis0,alpha0,bufsz0;eglGetConfigAttrib(edpy,cfg,EGL_NATIVE_VISUAL_ID,vis);eglGetConfigAttrib(edpy,cfg,EGL_ALPHA_SIZE,alpha);eglGetConfigAttrib(edpy,cfg,EGL_BUFFER_SIZE,bufsz);Visual*vDefaultVisual(dpy,scr);intdepthDefaultDepth(dpy,scr);XVisualInfo templ{.visualidvis},*vinfoNULL;intnvi0;if(match){vinfoXGetVisualInfo(dpy,VisualIDMask,templ,nvi);if(nvi0){vvinfo[0].visual;depthvinfo[0].depth;}}XSetWindowAttributes swa{0};swa.colormapXCreateColormap(dpy,RootWindow(dpy,scr),v,AllocNone);swa.event_maskStructureNotifyMask;Window winXCreateWindow(dpy,RootWindow(dpy,scr),0,0,320,240,0,depth,InputOutput,v,CWColormap|CWBackPixel|CWBorderPixel|CWEventMask,swa);XMapWindow(dpy,win);XSync(dpy,False);printf(vendor%-14s cfg:visual0x%02x alpha%d buffer%d | window visual0x%02x depth%d | ,eglQueryString(edpy,EGL_VENDOR),vis,alpha,bufsz,(unsigned)XVisualIDFromVisual(v),depth);eglBindAPI(EGL_OPENGL_ES_API);EGLSurface seglCreateWindowSurface(edpy,cfg,(EGLNativeWindowType)win,NULL);EGLint erreglGetError();if(sEGL_NO_SURFACE)printf(SURFACE FAILED error0x%04x\n,err);elseprintf(SURFACE OK\n);returnsEGL_NO_SURFACE?2:0;}附录 B 命令速查# 摄像头是否正常lsusbls-l/dev/video* getfacl-p/dev/video0 journalctl-k-b|grep-iuvc ffmpeg-fv4l2-list_formatsall-i/dev/video0fuser-v/dev/video*# 谁占着摄像头# 腾讯会议的媒体日志L~/.local/share/wemeetapp/Saas/Logs/xcast_$(date%Y%m%d%H).loggrep-ccreate_window_surface succeeded$Lgrep-cEGL_NO_SURFACE$Lgrep-aoErender\.avg\.fps\.[0-9.]$L|sort|uniq-cgrep-aoESnd\[big Cap:[0-9x./]$L|tail-3# 渲染器依赖哪个平台nm-D--undefined-only /opt/wemeet/lib/libxcast.so|grep-iEegl|wl_|X[A-Z]# EGL 属性数组在 .rodata 中的位置objdump-d--no-show-raw-insn /opt/wemeet/lib/libxcast.so|grep-B20call.*eglChooseConfig# 窗口真实的深度与 visualDISPLAY:0 xwininfo-idwid|grep-EDepth|Visual|Map State# 在 XWayland 上抓窗口内容DISPLAY:0 xdotool search--name腾讯会议DISPLAY:0 xwd-idwid-silent-outw.xwdffmpeg-iw.xwd w.png# 修复后确认进程环境tr\0\n/proc/pid/environ|grep-EEGL_VENDOR|LIBGL_ALWAYSgrep-aoElibEGL[^ ]*\.so[^ ]*/proc/pid/maps|sort-u# 刷新用户级桌面条目update-desktop-database ~/.local/share/applications参考Khronos EGL 注册与规范https://registry.khronos.org/EGL/Mesa 环境变量文档LIBGL_ALWAYS_SOFTWARE等https://docs.mesa3d.org/envvars.htmllibglvnd 项目EGL 实现分发与厂商配置https://gitlab.freedesktop.org/glvnd/libglvnd腾讯会议 Linux 客户端下载https://meeting.tencent.com/download-center.html
返回列表