1.初步libcef 使用
libcef (Chromium Embedded Framework) 是一个用于在应用程序中嵌入 Chromium 浏览器的框架。以下是使用 libcef 的基本步骤和一些重要概念:
1. 基本设置:
- 下载并安装 CEF SDK。
- 在项目中包含 CEF 头文件和库。
- 设置必要的运行时文件。
2. 初始化 CEF:
```cpp
CefSettings settings;
CefInitialize(main_args, settings, app, nullptr);
```
3. 创建浏览器窗口:
```cpp
CefWindowInfo window_info;
CefBrowserSettings browser_settings;
CefBrowserHost::CreateBrowser(window_info, client, url, browser_settings, nullptr, nullptr);
```
4. 实现客户端处理程序:
创建一个继承自 `CefClient` 的类,并实现必要的回调方法。
```cpp
class MyClient : public CefClient {
// 实现各种回调方法
};
```
5. 消息循环:
```cpp
CefRunMessageLoop();
```
6. 清理:
```cpp
CefShutdown();
```
重要概念:
1. 多进程架构:CEF 使用多进程架构,包括主进程和渲染进程。
2. 线程模型:CEF 有多个线程,如 UI 线程、IO 线程等。
3. 回调机制:通过实现各种接口来处理事件和回调。
4. JavaScript 集成:可以在 C++ 和 JavaScript 之间进行交互。
5. 离屏渲染:支持将网页内容渲染到内存中而不是直接显示。
6. 自定义方案:可以注册自定义 URL 方案处理程序。
示例代码(简化版):
```cpp
#include <cef_app.h>
#include <cef_client.h>
class SimpleApp : public CefApp, public CefBrowserProcessHandler {
public:
SimpleApp() {}
virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler() override { return this; }
virtual void OnContextInitialized() override {
// 创建浏览器窗口
CefWindowInfo window_info;
CefBrowserSettings browser_settings;
CefRefPtr<SimpleClient> client(new SimpleClient());
CefBrowserHost::CreateBrowser(window_info, client.get(), "http://www.google.com", browser_settings, nullptr, nullptr);
}
IMPLEMENT_REFCOUNTING(SimpleApp);
};
int main(int argc, char* argv[]) {
CefMainArgs main_args(argc, argv);
CefRefPtr<SimpleApp> app(new SimpleApp());
return CefExecuteProcess(main_args, app.get(), nullptr);
}
```
这只是一个非常基础的例子。实际应用中,您可能需要处理更多的细节,如窗口创建、事件处理、自定义渲染等。建议查阅 CEF 官方文档和示例以获取更详细的信息和最佳实践。
2. libcef 重新编译支持 mp4
要重新编译 libcef 以确保支持 MP4,需要遵循以下步骤:
1. 获取 Chromium 源码:
由于 CEF 是基于 Chromium 的,首先需要获取 Chromium 的源代码。
```
git clone https://chromium.googlesource.com/chromium/src.git
```
2. 获取 CEF 源码:
在 Chromium 源码目录中,获取 CEF 源码。
```
git clone https://bitbucket.org/chromiumembedded/cef.git
```
3. 同步依赖项:
使用 Chromium 的工具同步所有必要的依赖项。
```
gclient sync
```
4. 配置编译选项:
确保 MP4 相关的编译选项被启用。编辑 `args.gn` 文件,添加或修改以下选项:
```
proprietary_codecs = true
ffmpeg_branding = "Chrome"
```
这些选项将启用专有编解码器,包括 MP4 支持。
5. 生成项目文件:
使用 GN 工具生成项目文件。
```
gn gen out/Release --args="is_official_build=true proprietary_codecs=true ffmpeg_branding=\"Chrome\""
```
6. 编译 CEF:
使用 Ninja 或其他适当的构建工具进行编译。
```
ninja -C out/Release cef
```
7. 打包 CEF:
使用 CEF 提供的脚本创建分发包。
```
python tools/make_distrib.py --ninja-build
```
注意事项:
- 编译过程可能需要几个小时,具体取决于你的硬件配置。
- 确保你有足够的磁盘空间(至少 40GB)。
- 编译过程中可能会遇到各种依赖问题,需要根据错误信息逐一解决。
- 不同版本的 Chromium 和 CEF 可能有slight差异在编译步骤上,请参考相应版本的文档。
完成这些步骤后,你应该得到一个支持 MP4 的 CEF 构建。记得在你的应用中使用这个新构建的 CEF 版本,并进行充分测试以确保 MP4 支持正常工作。
注意事项
在使用 `gn gen out/Release --args` 命令时,你可以指定多个编译选项来定制 CEF 的构建。以下是一些常用和重要的编译选项,特别是对于支持 MP4 和优化性能的选项:
1. 基本选项:
```
is_debug = false
is_official_build = true
```
2. 编解码器支持(包括 MP4):
```
proprietary_codecs = true
ffmpeg_branding = "Chrome"
```
3. 符号选项:
```
symbol_level = 0 # 减小二进制文件大小
```
4. 优化选项:
```
use_jumbo_build = true # 加速编译
enable_nacl = false # 禁用 Native Client,除非你需要
```
5. 平台特定选项(Windows 示例):
```
target_cpu = "x64" # 或 "x86" 用于 32 位
is_win_fastlink = true # 加速链接
```
6. 硬件加速:
```
enable_vulkan = true
use_vaapi = true # 仅适用于 Linux
```
7. 其他多媒体选项:
```
enable_widevine = true # 如果需要 DRM 支持
enable_hevc_demuxing = true # 支持 H.265/HEVC
```
8. CEF 特定选项:
```
is_component_build = false
use_sysroot = false
```
完整的命令示例:
```bash
gn gen out/Release --args="is_debug=false is_official_build=true proprietary_codecs=true ffmpeg_branding=\"Chrome\" symbol_level=0 use_jumbo_build=true enable_nacl=false target_cpu=\"x64\" is_win_fastlink=true enable_vulkan=true use_vaapi=true enable_widevine=true enable_hevc_demuxing=true is_component_build=false use_sysroot=false"
```
注意事项:
1. 这些选项可能需要根据你的具体需求和目标平台进行调整。
2. 某些选项可能在不同的 Chromium/CEF 版本中有所变化,请查阅当前版本的文档。
3. 添加 `use_goma=true` 如果你使用 Google 的 Goma 编译加速服务。
4. 对于 Linux,可能需要添加 `use_system_libdrm=false`。
5. 如果遇到编译错误,可能需要逐个调整这些选项。
6. 确保你有足够的系统资源(CPU、内存、磁盘空间)来进行编译。
在运行 `gn gen` 命令后,使用 `ninja -C out/Release cef` 来开始实际的编译过程。根据你的硬件配置,这可能需要几个小时的时间。