资讯动态

VS2019 编译 CEF win64 开启 H264/H265 支持实战

发布时间:2026/10/18 11:59:00 来源:尧图企业网站定制
简介CEF-win64版本5563是基于Visual Studio 2019编译的Chromium Embedded Framework资源包面向需要在Windows 64位应用中嵌入浏览器内核的C开发者尤其适合涉及在线教育、直播、视频会议等对H264/H265编解码有硬性要求的场景。压缩包共1055个文件约278.47MB以539个h头文件与359个cc源文件为主体辅以58个pak资源包、14个dll动态库、4个lib导入库及若干cmake、gypi构建配置另含README说明、LICENSE许可与tests测试代码目录结构完整便于二次开发与定制编译。已有484人学习下载。借助CMake构建脚本与路径配置文件读者可快速完成环境搭建、按需裁剪模块并直接复用H264/H265播放能力减少从零集成浏览器内核的试错成本。1. 从一次编译翻车说起为什么 win64 版 CEF 的 H264/265 支持这么难搞去年帮一个做视频会议客户端的团队排查播放器黑屏问题折腾了整整两天最后定位到的根因让人哭笑不得他们从网上随手下载的 CEF win64 预编译包默认根本没带 H264 和 H265 解码能力H5 页面里video标签加载 MP4 直接静默失败控制台连个像样的报错都没有。这就是 CEF 生态里最经典的玄学坑——Chromium 官方出于授权原因默认关闭了私有编解码器而绝大多数第三方预编译包为了省事也沿用了这个默认配置。你要么自己从源码编译要么找到明确标注支持 H264/265 的构建产物。这篇笔记记录的就是我在 VS2019 环境下从零搭建一套支持 H264/H265 的 CEF win64 开发环境的完整过程包括版本怎么选、依赖怎么配、编译参数怎么改、装完怎么验证。如果你正在做 Windows 桌面端内嵌浏览器的项目尤其是涉及视频播放、直播、安防监控这类场景这套环境搭建路径应该能帮你少走不少弯路。2. 环境准备与版本选型VS2019 工具链和 CEF 分支怎么对2.1 先确认你的 VS2019 装全了没有很多人以为 VS2019 装个 Community 版就万事大吉结果编译到一半报MSB8020找不到 v142 工具集或者windows.h里的某个 SDK 接口对不上。CEF 的 Windows 构建对工具链版本相当敏感我一般会先把下面这几个组件确认一遍工作负载勾选「使用 C 的桌面开发」单个组件确保安装了 Windows 10 SDK版本 10.0.19041.0 或更高、MSVC v142 - VS 2019 C x64/x86 生成工具最新版、C ATL for v142最新版调试工具Windows 10 SDK 里的「调试工具 for Windows」建议一并装上后面排查崩溃 dump 用得到装完之后用命令行验证一下# 打开 VS2019 的 x64 Native Tools Command Prompt cl.exe # 正常输出应包含 19.29.xxxxx 版本号对应 VS2019 16.11 系列如果cl.exe提示找不到命令说明你开的是普通 cmd 而不是 VS 自带的开发者命令行这个细节新手很容易忽略。2.2 CEF 分支和版本的选择逻辑CEF 的版本号跟 Chromium 主版本号是对应的比如 CEF 120.x 对应 Chromium 120。选哪个版本核心看两点你的项目需要哪些 Chromium 特性以及你打算用哪个 CEF 分支类型。CEF 官方提供三种分支分支类型更新频率适用场景H264/265 支持Stable跟随 Chromium Stable生产环境需自行编译开启Beta跟随 Chromium Beta尝鲜测试需自行编译开启Master每日构建跟进最新特性需自行编译开启关键问题来了官方所有分支的预编译二进制包默认都不包含 H264/H265 的专利编解码器。这不是 bug是法律层面的取舍。所以你要么自己从源码编译要么找社区维护的、明确开启了proprietary_codecstrue和ffmpeg_brandingChrome的构建产物。我一般会选一个 Stable 分支里相对成熟的版本比如 CEF 120.x 或 121.x 系列太新的版本可能刚合入 Chromium 的大改动编译翻车概率高太老的版本又可能缺少某些现代 Web API。具体到 VS2019注意 CEF 从某个版本开始要求 VS2022 了所以选版本时务必确认它的构建文档里写的还是 v142 工具集。2.3 目录结构规划在动手之前先把目录规划好后面编译和引用会清爽很多D:\dev\ ├── cef\ # CEF 源码和构建目录 │ ├── chromium_git\ # Chromium 源码如果从源码编译 │ ├── cef\ # CEF 源码 │ └── build\ # 构建输出 ├── depot_tools\ # Chromium 构建工具链 └── projects\ # 你自己的项目depot_tools是 Chromium 体系的构建工具集合包含gclient、gn、ninja等后面从源码编译 CEF 必须用它。把它加到系统 PATH 里但注意不要跟其他工具冲突。提示整个 CEF 源码加构建产物轻松超过 100GB确保你的 D 盘或专门的数据盘有足够空间SSD 是必须的机械硬盘编译一次能等到天荒地老。3. 获取 CEF 源码与依赖从 depot_tools 到 gclient 同步3.1 安装 depot_tools从 Chromium 官方渠道获取 depot_tools 压缩包解压到D:\dev\depot_tools然后把这个路径加到系统环境变量 PATH 的最前面。注意是最前面因为 depot_tools 里自带了一份 git 和 python如果被系统里其他版本抢先后面 gclient 同步会出各种诡异错误。# 验证 depot_tools 是否生效 gclient --version # 应输出类似 gclient (depot_tools) 的版本信息 # 设置必要的环境变量 set DEPOT_TOOLS_WIN_TOOLCHAIN0 set GYP_MSVS_VERSION2019DEPOT_TOOLS_WIN_TOOLCHAIN0的意思是告诉构建系统使用本机安装的 VS2019而不是去下载 Google 内部用的工具链。GYP_MSVS_VERSION2019是给老版本构建脚本用的虽然现在主力是 GN但某些环节还会读这个变量。3.2 拉取 CEF 源码CEF 的源码获取有一套标准流程核心是用automate-git.py脚本自动完成 Chromium 和 CEF 的同步。先建好目录然后下载这个脚本# 创建构建目录 mkdir D:\dev\cef cd D:\dev\cef # 下载 automate-git.py # 这个脚本负责协调 Chromium 和 CEF 的版本匹配然后执行同步命令。这里以 CEF 120.x 分支为例python automate-git.py --download-dirD:\dev\cef --branch120.1.9 --minimal-distrib --force-clean --no-depot-tools-update参数逐个说清楚--download-dir指定下载和构建的根目录--branch指定 CEF 分支版本格式是主版本.次版本.补丁号--minimal-distrib只生成最小分发集不包含测试程序和调试符号省空间--force-clean强制清理之前的构建产物避免残留文件干扰--no-depot-tools-update跳过 depot_tools 自更新防止它把你本地的工具链版本改掉这个同步过程视网络情况可能要几个小时中间如果断了重新执行同样的命令会断点续传。我一般会挂在那里去干别的事回来再看。3.3 确认 H264/265 相关的 GN 参数源码同步完成后进入 Chromium 的src目录找到out目录下的构建配置。CEF 的构建配置在cef\binary_distrib或cef\cmake里会有模板但核心的 GN 参数你得自己确认。打开args.gn文件确保包含以下关键项# 在 Chromium src 目录下执行 gn args out\Release_GN_x64 # 在打开的编辑器中确认以下参数 is_official_build true is_component_build false proprietary_codecs true ffmpeg_branding Chrome enable_widevine trueproprietary_codecs true是开启 H264/H265 支持的总开关没有这一行后面全白搭。ffmpeg_branding Chrome决定了 FFmpeg 使用哪个品牌的编解码器集合设成Chrome才会包含 AAC、H264 这些专利格式。enable_widevine是 DRM 支持如果你的场景涉及加密视频流这个也要开。注意is_official_build true会启用大量优化编译时间更长但产出的二进制性能更好、体积更小。调试阶段可以先用false加快迭代最终发布再切回true。4. 编译与集成VS2019 下生成 win64 动态库4.1 执行编译GN 参数配好之后用 ninja 执行编译。CEF 的编译目标主要是cefclient和libcef但如果你只需要动态库可以只编libcef# 在 Chromium src 目录下 ninja -C out\Release_GN_x64 libcef这个命令会编译出libcef.dll、libcef.lib以及配套的chrome_elf.dll等文件。编译时间取决于机器配置16 核 32 线程的机器大概 40 分钟到 1 小时8 核的机器可能要 2 小时以上。如果中途报错先看错误信息里有没有proprietary_codecs相关的警告那说明你的 GN 参数没生效。编译完成后产物在out\Release_GN_x64目录下。你需要的是这几个文件libcef.dll核心动态库几百 MBlibcef.lib导入库链接时用chrome_elf.dllELF 加载器必须跟 libcef.dll 放一起cef.pak、cef_100_percent.pak、cef_200_percent.pak资源包locales文件夹本地化资源swiftshader文件夹软件渲染后备4.2 在 VS2019 项目中集成 CEF新建一个 VS2019 的 C 项目或者在你现有项目里配置。核心是设置头文件路径、库路径和运行时依赖。头文件路径把 CEF 源码里的include目录加到项目的附加包含目录# 项目属性 - C/C - 常规 - 附加包含目录 D:\dev\cef\chromium\src\cef\include库路径把编译产物的目录加到附加库目录# 项目属性 - 链接器 - 常规 - 附加库目录 D:\dev\cef\chromium\src\out\Release_GN_x64链接库在链接器输入里加上libcef.lib和libcef_dll_wrapper.lib。后者是 CEF 的 C 封装层需要单独编译# 编译 libcef_dll_wrapper cd D:\dev\cef\chromium\src\cef mkdir build cd build cmake -G Visual Studio 16 2019 -A x64 .. cmake --build . --config Release编译出来的libcef_dll_wrapper.lib在cef\build\libcef_dll_wrapper\Release目录下。运行时依赖把前面列出的那些 dll、pak、locales 文件夹全部拷贝到你的 exe 输出目录。少一个文件程序启动就崩而且崩得莫名其妙。4.3 一个最小的 CEF 初始化代码集成完成后用下面这段代码验证 CEF 能不能正常启动#include include/cef_app.h #include include/cef_client.h class SimpleApp : public CefApp, public CefBrowserProcessHandler { public: CefRefPtrCefBrowserProcessHandler GetBrowserProcessHandler() override { return this; } void OnContextInitialized() override { // CEF 初始化完成后的回调 // 这里可以创建浏览器窗口 } }; int main(int argc, char* argv[]) { CefMainArgs main_args(GetModuleHandle(nullptr)); CefRefPtrSimpleApp app(new SimpleApp()); // 执行子进程逻辑 int exit_code CefExecuteProcess(main_args, app, nullptr); if (exit_code 0) { return exit_code; } // 配置 CEF 设置 CefSettings settings; settings.no_sandbox true; // 调试阶段关闭沙箱 settings.multi_threaded_message_loop true; // 初始化 CEF CefInitialize(main_args, settings, app, nullptr); CefRunMessageLoop(); CefShutdown(); return 0; }这段代码的关键点CefExecuteProcess必须放在CefInitialize之前它负责处理 CEF 的子进程逻辑。no_sandbox true在调试阶段可以避免权限问题但正式发布时建议开启沙箱。multi_threaded_message_loop true让 CEF 在自己的线程里跑消息循环适合跟现有 UI 框架集成。编译运行如果能看到窗口正常创建、没有崩溃说明基础环境通了。接下来才是验证 H264/265 的关键步骤。5. 避坑与排查H264/265 支持失效的五种典型情况5.1 视频黑屏但音频正常现象H5 页面里video标签加载 MP4 文件声音能出来画面全黑控制台无报错。原因这是最典型的 H264 解码器缺失表现。FFmpeg 在编译时没有包含 H264 解码器但音频用的 AAC 解码器恰好被包含了所以出现音视频不同步的诡异现象。解决回到 GN 参数确认proprietary_codecs true和ffmpeg_branding Chrome都写了。改完之后必须--force-clean重新编译增量编译不会重新生成 FFmpeg 的配置。5.2 报错 Could not load ffmpeg.dll现象程序启动时报找不到ffmpeg.dll或者加载后立即崩溃。原因CEF 的 FFmpeg 实现有两种链接方式一种是静态链进libcef.dll一种是独立的ffmpeg.dll。如果你用的构建配置是后者但拷贝文件时漏了ffmpeg.dll就会报这个错。解决检查编译输出目录里有没有ffmpeg.dll有的话一并拷贝到 exe 目录。如果没有说明是静态链接模式那问题可能出在libcef.dll本身不完整重新编译。5.3 VS2019 链接报错 LNK2038 检测到 RuntimeLibrary 不匹配现象链接阶段报LNK2038: 检测到RuntimeLibrary的不匹配: 值MT_StaticRelease不匹配值MD_DynamicRelease。原因CEF 的libcef_dll_wrapper默认用/MT静态运行时编译而你的项目可能用的是/MD动态运行时。两者不能混用。解决统一运行时库设置。在 CMake 编译libcef_dll_wrapper时加上-DCMAKE_MSVC_RUNTIME_LIBRARYMultiThreadedDLL或者在你的 VS 项目里把运行时库改成/MT。我一般推荐统一用/MD因为 CEF 本身的libcef.dll就是动态运行时。5.4 H265 能播 H264 不能播或者反过来现象一种编码格式正常另一种死活不出画面。原因H264 和 H265 在 FFmpeg 里是两个独立的解码器proprietary_codecs true理论上两个都开但某些 CEF 版本的构建脚本里 H265 的开关是单独的。另外H265 在浏览器端的支持本身就不如 H264 普遍某些 Chromium 版本需要额外的 flag。解决先确认你的 CEF 版本对应的 Chromium 版本是否支持 H265。如果不支持换更新的 CEF 分支。如果支持但不出画面在CefSettings里加上settings.command_line_args_disabled false然后通过命令行参数--enable-featuresPlatformHEVCDecoderSupport试试。5.5 编译通过但运行时报 Invalid file descriptor to ICU data现象程序启动时崩溃日志里出现 ICU 数据文件相关的错误。原因icudtl.dat文件没有跟 exe 放在同一目录或者版本不匹配。ICU 是 Chromium 的国际化库CEF 启动时必须加载这个数据文件。解决从编译输出目录里找到icudtl.dat拷贝到 exe 同级目录。注意不要从其他版本的 CEF 里拿这个文件版本不匹配一样会崩。6. 装完怎么验证三个必做的检查动作环境搭完、代码编译通过不代表 H264/265 就真的能用了。我一般会走下面三个验证步骤确认这套环境是真的跑通了而不是表面看着正常。6.1 用 CEF 自带的 cefclient 做基准测试编译的时候如果没加--minimal-distrib会同时产出cefclient.exe。这个程序是 CEF 官方提供的功能演示里面有一个「Tests」菜单可以加载各种测试页面。找到视频测试相关的用例加载一个标准 H264 MP4 文件看能不能正常播放。如果 cefclient 都播不了那你的构建配置肯定有问题先别急着集成到自己的项目里。6.2 写一个最小 HTML 页面做编解码探测在你的 CEF 应用里加载下面这个页面它会用MediaSourceAPI 探测浏览器支持的编解码器!DOCTYPE html html body script const codecs [ video/mp4; codecsavc1.42E01E, // H264 Baseline video/mp4; codecsavc1.64001F, // H264 High video/mp4; codecshev1.1.6.L93.B0, // H265 audio/mp4; codecsmp4a.40.2 // AAC ]; codecs.forEach(codec { const support MediaSource.isTypeSupported(codec); console.log(codec - (support ? 支持 : 不支持)); document.body.innerHTML p codec : (support ? ✅ 支持 : ❌ 不支持) /p; }); /script /body /html如果 H264 和 H265 那两行都显示支持说明编解码器配置正确。如果 H264 支持但 H265 不支持检查你的 CEF 版本是否包含 HEVC 解码器。如果两个都不支持回到第 3 章的 GN 参数重新检查。6.3 实际播放一个本地视频文件探测 API 说支持不代表实际播放没问题。找一个真实的 H264 MP4 和 H265 MP4 文件用video标签加载观察画面是否正常渲染有没有绿屏、花屏音视频是否同步拖动进度条是否流畅长时间播放有没有内存泄漏我一般会循环播放至少 30 分钟同时用任务管理器盯着内存占用。CEF 的视频解码如果配置不当长时间播放可能出现内存持续增长的问题这个在安防监控场景里是致命的。提示验证阶段建议把settings.log_severity LOGSEVERITY_INFO打开CEF 会把 FFmpeg 的初始化日志输出到调试控制台能看到具体加载了哪些解码器。从那以后我每次搭 CEF 环境都会先把这三个验证动作走一遍确认 H264/265 真的能用了再往项目里集成。这套流程帮我省下了至少三次「集成完才发现播不了视频」的返工。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑