资讯动态

CEF 115 Windows 非官方编译:开启 MP4/MP3 支持实战

发布时间:2026/10/1 2:11:19 来源:尧图企业网站定制
简介这是一份面向Windows桌面应用开发者的CEF 115.0.5790.102非官方编译包基于Chromium 115版本构建针对64位Windows系统优化并额外支持MP4、MP3等媒体格式播放。对于需要在桌面程序中嵌入浏览器内核、实现网页渲染、JavaScript执行或多媒体界面展示的开发者而言该版本可省去自行编译的繁琐流程直接用于游戏开发、复杂桌面应用界面及高度自定义浏览器功能等场景。压缩包共1046个文件约144.71MB以539个C头文件、359个源文件为核心辅以60个pak资源包、7个动态库、若干HTML与图标清单文件构成完整的开发目录结构。目前已有39人学习下载。借助该资源开发者可快速获取可用的CEF二进制库与头文件结合API实现网络请求处理、插件扩展及音视频内容嵌入同时需留意非官方编译在更新频率、兼容性及多媒体解码器授权方面的潜在限制。1. CEF 115 非官方编译为什么官方包放不了 MP4以及这套方案适合谁如果你用 CEFChromium Embedded Framework做过 Windows 桌面客户端大概率遇到过这个场景界面里嵌了个浏览器控件想播一段本地 MP4 或者放一首 MP3结果video标签一片空白控制台丢出一句DEMUXER_ERROR_COULD_NOT_OPEN或者干脆静默失败。这不是你代码写错了而是 CEF 官方预编译的二进制分发包Standard Distribution出于授权和体积考虑默认裁掉了 H.264、AAC、MP3 这些带专利的编解码器。CEF 115.0.5790.102 这个版本对应的 Chromium 内核是 11564 位 Windows 平台官方包同样不含这些 proprietary codecs。所以「CEF115.0.5790.102 Windows 非官方编译(支持MP4, MP3等)」这件事的本质就是自己拉源码、改 GN 编译参数、把proprietary_codecstrue和ffmpeg_brandingChrome打开重新产出一套带完整媒体能力的 64 位二进制。它解决的是「客户端内嵌浏览器要播本地或在线 MP4/MP3」这个刚需适合做桌面播放器、监控回放客户端、教育软件、工业 HMI 的工程师。代价是编译链路长、依赖多、一次全量构建动辄几小时但一旦跑通你手里就有了一套可复现、可升级、不依赖第三方的媒体能力底座。下面把我自己走通的路径拆开讲。2. 编译前的环境与源码准备把 115 分支拉对、依赖装齐2.1 为什么必须锁 115.0.5790.102 这个 tagCEF 的版本号和 Chromium 是绑定的115.0.5790.102 对应 Chromium 115.0.5790.102分支号是 5790。你如果随手拉 master编出来的 API 和头文件跟 115 的二进制对不上后面libcef_dll_wrapper链接会直接报符号缺失。常见做法是用automate-git.py脚本指定--branch5790让它自动同步 chromium 和 cef 两个仓库到匹配的 commit。这一步是后面所有操作的地基拉错分支等于白编。先准备目录结构和 depot_tools。depot_tools 是 Chromium 的构建工具集合包含gclient、gn、ninja这些关键命令必须放在 PATH 最前面否则会跟系统里已有的 Python 或 git 冲突。# 目录规划所有东西放在同一个盘避免跨盘符号链接问题 mkdir C:\cef115 cd C:\cef115 # 拉 depot_toolsChromium 官方构建工具集 git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git # 把 depot_tools 加到 PATH 最前面Windows 下用 setcmd或 $envpowershell set PATHC:\cef115\depot_tools;%PATH% set DEPOT_TOOLS_WIN_TOOLCHAIN0DEPOT_TOOLS_WIN_TOOLCHAIN0这行很关键它告诉构建系统用本机已装的 Visual Studio而不是去下载 Google 内部工具链。不设这个gclient runhooks阶段会卡在下载 toolchain 上国内网络环境下基本下不动。2.2 Visual Studio 版本与 Windows SDK 的匹配Chromium 115 官方要求 VS202217.x并且需要安装「使用 C 的桌面开发」工作负载外加 Windows 10 SDK 10.0.20348 或更高。我踩过的坑是只装了 VS 的默认组件缺了 ATL 和 MFC编译到一半报atlbase.h not found。另外 SDK 版本别贪新装一个 10.0.22621 就够装太多版本反而让 gn 选错。装完 VS 后用管理员权限打开「x64 Native Tools Command Prompt for VS 2022」所有编译命令都在这个环境里跑它自动配好了vcvarsall。别用普通 cmd否则 cl.exe 找不到。2.3 用 automate-git.py 拉取并同步源码automate-git.py是 CEF 官方提供的自动化脚本能一次性完成 chromium 检出、cef 检出、依赖同步。把它下载到工作目录然后执行# 下载 automate-git.py cd C:\cef115 curl -O https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py # 拉取 5790 分支源码--no-build 表示只同步不编译 python automate-git.py --download-dirC:\cef115\code ^ --branch5790 ^ --no-build ^ --force-clean--branch5790锁定分支--no-build先只同步确认源码完整再编。--force-clean会清掉已有 checkout第一次跑可以加后续增量同步别加否则每次重拉几十 GB。同步完成后C:\cef115\code\chromium\src是 Chromium 源码C:\cef115\code\cef是 CEF 源码。这一步耗时取决于网络几个 GB 到十几 GB建议挂个稳定网络慢慢等。提示同步过程中如果gclient报某个 DEPS 依赖拉取失败多半是网络问题重跑gclient sync即可它会断点续传不用从头来。3. 打开 proprietary codecsGN 参数怎么改、改哪几个3.1 默认关闭 MP4/MP3 的根因在 ffmpeg_brandingCEF 官方构建脚本cef_create_projects.bat里默认传给 GN 的参数是ffmpeg_brandingChromium。这个 branding 对应的 ffmpeg 构建配置里H.264、AAC、MP3 这些解码器是被排除的。要支持 MP4H.264 视频 AAC 音频和 MP3必须把它改成Chrome同时打开proprietary_codecstrue。这两个参数是配套的只改一个不生效。具体位置在C:\cef115\code\cef\create.bat或cef_create_projects.bat找到设置 GN_DEFINES 的那一段。我一般直接改脚本而不是每次命令行传避免漏参数。:: 修改 create.bat 中的 GN_DEFINES set GN_DEFINESis_official_buildtrue proprietary_codecstrue ffmpeg_brandingChrome :: 64 位构建确保 target_cpu 是 x64 set GN_ARGUMENTS--idevs2022 --slncef --filters//cef/* --target-cpux64is_official_buildtrue会开启正式构建的优化体积更小、性能更好但编译时间更长。如果你只是内部测试可以先设 false 加快迭代出正式包再改回 true。proprietary_codecstrue是总开关ffmpeg_brandingChrome决定 ffmpeg 具体编进哪些解码器。3.2 确认 H.264/AAC/MP3 真的被编进去了改完参数别急着全量编译先跑 GN 生成工程然后检查生成的args.gn里参数是否生效。GN 生成后会在out\Release_GN_x64\args.gn留下实际使用的参数打开核对# 生成 VS 工程文件 cd C:\cef115\code\cef .\create.bat # 检查实际生效的 GN 参数 type C:\cef115\code\chromium\src\out\Release_GN_x64\args.gn在args.gn里你应该能看到proprietary_codecs true和ffmpeg_branding Chrome。如果没看到说明 create.bat 的修改没被读取检查是不是有环境变量覆盖了 GN_DEFINES。确认无误后再进入编译否则编几小时出来发现还是放不了 MP4那才是真的血泪。3.3 编译命令与耗时预期编译用 ninja目标是cef和cef_sandbox。全量编译在 16 核机器上大约 2 到 4 小时8 核可能 6 小时以上。建议用--targetcef只编核心目标别编整个 chromium 的所有测试目标。cd C:\cef115\code\chromium\src ninja -C out\Release_GN_x64 cef编完后产物在out\Release_GN_x64下核心是libcef.dll、libcef.lib、chrome_elf.dll以及cefclient.exe等示例程序。用cefclient.exe打开一个本地 MP4 测试能播就说明编解码器进去了。这一步是整个流程的验收点播不了就别往下走回头查 args.gn。注意is_official_buildtrue时libcef.dll体积会到 200MB 上下这是正常的因为静态链接了大量 chromium 组件。别用 UPX 之类去压容易压坏导致加载失败。4. 打包与集成把编译产物塞进你的客户端并验证 MP4/MP34.1 用 cef_create_projects 产出的二进制目录结构编译完成后CEF 提供了一套二进制分发目录通常在C:\cef115\code\chromium\src\cef\binary\下具体路径取决于 automate-git.py 的配置。这个目录里包含Release、Resources、include、libcef_dll等。你要集成到自己的客户端需要的是文件/目录作用是否必须libcef.dllCEF 核心动态库必须chrome_elf.dll崩溃处理与沙箱辅助必须libcef.lib链接导入库编译期必须include/CEF 头文件编译期必须libcef_dll_wrapper.libC 封装层静态库编译期必须Resources/本地化资源 pak必须cefclient.exe官方示例用于验证验证用libcef_dll_wrapper需要你自己用 VS 编译源码在cef\libcef_dll\下用 CMake 或直接开 VS 工程编成静态库然后链接进你的程序。4.2 在客户端里加载本地 MP4 的最小验证代码集成后别急着上业务逻辑先写一个最小 HTML 验证媒体能力。把下面这段 HTML 放到你的 CEF 浏览器里加载!DOCTYPE html html body !-- 本地 MP4注意路径用 file:/// 或你的自定义 scheme -- video idv width640 height360 controls source srctest.mp4 typevideo/mp4 /video audio ida controls source srctest.mp3 typeaudio/mpeg /audio script // 监听错误方便定位是解码器缺失还是路径问题 document.getElementById(v).addEventListener(error, function(e) { console.error(video error code:, this.error this.error.code); }); document.getElementById(a).addEventListener(error, function(e) { console.error(audio error code:, this.error this.error.code); }); /script /body /html如果视频黑屏但控制台报MEDIA_ERR_SRC_NOT_SUPPORTEDcode 4基本就是解码器没编进去回去查第 3 章的 args.gn。如果报MEDIA_ERR_SRC_NOT_SUPPORTED但路径是网络地址先确认 CEF 的--allow-file-access-from-files或自定义 scheme 是否放行。MP3 同理audio/mpeg能播说明 AAC/MP3 解码器都在。4.3 命令行开关对媒体播放的影响CEF 初始化时传的命令行参数会影响媒体行为。常见需要加的// CefInitialize 之前追加命令行开关 CefRefPtrCefCommandLine cmd CefCommandLine::CreateCommandLine(); cmd-AppendSwitch(allow-file-access-from-files); // 允许 file:// 访问本地文件 cmd-AppendSwitch(disable-web-security); // 仅调试用正式别开 cmd-AppendSwitchWithValue(autoplay-policy, no-user-gesture-required); // 自动播放autoplay-policy这个开关在 115 里仍然有效不加的话video autoplay会被浏览器策略拦掉表现为「代码没错但就是不自动播」。allow-file-access-from-files在加载本地 MP4 时经常是必需的尤其是你用file://协议直接指向磁盘文件。提示正式发布时别开disable-web-security它会让 CEF 忽略同源策略属于调试后门。用自定义 scheme 或本地 HTTP 服务替代。5. 避坑与排查编译和播放 MP4/MP3 时最容易翻车的 5 个点5.1 现象编译通过但 video 标签报 code 4原因GN 参数没生效ffmpeg_branding还是 Chromium或者proprietary_codecs没打开。有时候 create.bat 改了但环境变量GN_DEFINES在别处被覆盖导致实际用的还是旧值。解决编之前一定type args.gn核对确认两行都在。如果不在检查是不是有GYP_DEFINES或系统环境变量干扰清掉重跑 create.bat。编完后用cefclient.exe先验证别直接集成到业务里。5.2 现象ninja 编译到 90% 报链接错误符号缺失原因libcef_dll_wrapper用的头文件和libcef.dll不是同一版本或者 VS 的运行时库/MT vs /MD不一致。Chromium 默认用 /MT你的 wrapper 如果设了 /MD 就会冲突。解决wrapper 工程里把「代码生成 → 运行时库」设成「多线程 (/MT)」跟 chromium 保持一致。头文件用编译产物里include/目录的别混用旧版本。5.3 现象MP3 能播MP4 只有声音没画面原因H.264 视频解码器没编进去但 AAC 音频编进去了。这通常是因为ffmpeg_brandingChrome设了但proprietary_codecs漏了或者 ffmpeg 的 GN 配置里 H.264 被单独关掉。解决确认两个参数都在。如果还不行检查third_party/ffmpeg/ffmpeg_generated.gni里ffmpeg_branding_chrome对应的 decoder 列表是否包含 h264。一般官方脚本改对参数就全有不用手改这个文件。5.4 现象本地 MP4 路径带中文或空格加载失败原因file://协议对中文和空格需要 URL 编码CEF 默认不会自动转。路径里带空格或中文source src直接写原始路径会 404。解决用QUrl::toPercentEncoding或 JS 的encodeURI处理路径或者干脆起一个本地 HTTP 服务用http://127.0.0.1:port/test.mp4加载绕开 file 协议的各种限制。这也是很多监控回放客户端的常见做法。5.5 现象编译几小时后磁盘爆满原因Chromium 全量编译中间产物极大out目录轻松上百 GB加上源码和依赖整个工作目录 200GB 起步。解决编译盘至少留 250GB 空闲。编完用ninja -C out\Release_GN_x64 -t clean清中间产物只留最终 dll 和 lib。别在系统盘编C 盘红了会连 VS 都跑不动。6. 进阶把媒体能力做成可复用构建脚本与版本升级习惯走到这里你已经有一套能播 MP4/MP3 的 CEF 115 64 位二进制了。但真正省事的做法是把整个流程脚本化下次升到 116、117 时只改一个分支号就能重跑。我自己的习惯是维护一个build_cef.bat把环境变量、分支号、GN 参数全抽成变量放在最上面。echo off :: 一键构建脚本升级只需改 BRANCH 和 CEF_VERSION set BRANCH5790 set CEF_VERSION115.0.5790.102 set WORKDIRC:\cef115 set PATH%WORKDIR%\depot_tools;%PATH% set DEPOT_TOOLS_WIN_TOOLCHAIN0 :: 同步源码 python %WORKDIR%\automate-git.py --download-dir%WORKDIR%\code ^ --branch%BRANCH% --no-build :: 改 GN 参数也可以提前改好 create.bat :: proprietary_codecstrue ffmpeg_brandingChrome :: 生成工程并编译 cd /d %WORKDIR%\code\cef call create.bat cd /d %WORKDIR%\code\chromium\src ninja -C out\Release_GN_x64 cef echo Build done for CEF %CEF_VERSION%这个脚本的价值在于升级时你只需要改BRANCH和CEF_VERSION两个变量其余流程不变。但要注意Chromium 大版本升级时 GN 参数名偶尔会变比如某些版本ffmpeg_branding的取值集合调整过升级后第一件事还是type args.gn核对别盲目信任旧脚本。验证方法上我一般准备三个测试文件一个 H.264AAC 的 MP4、一个纯 MP3、一个 HEVC 编码的 MP4。前两个必须能播第三个播不了是正常的因为 CEF 默认不含 HEVC 解码器专利更严。如果你业务里确实要 HEVC那得额外引入硬件解码或第三方解码库那是另一个话题了。用这三个文件跑一遍cefclient.exe能过就说明这套二进制可以进你的发布流程。最后说个我自己的教训第一次编 CEF 时我没核对 args.gn编了 5 个小时集成进去发现 MP4 还是放不了回头一查是 create.bat 里 GN_DEFINES 被一个残留的环境变量覆盖了。从那以后我养成了一个习惯——任何构建先看实际生效的参数文件再看编译日志最后才信自己的记忆。这套流程跑顺之后CEF 的媒体能力就不再是玄学而是一个你能完全掌控的构建产物。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑