当前位置:   article > 正文

Win10下编译cef使其支持H.264、H.265_编译cef h264

编译cef h264

一、准备

1、环境要求
  • 一台不低于8G内存200G硬盘空间的主机
  • Visual Studio 2019 仅安装“使用C++的桌面开发”即可
  • Windows 10 SDK 19041
  • 英文版的win10
  • 文本编辑器Visual Studio Code
  • 稳定的梯子
2、系统配置
  1. 安装vs2019,选择 使用C++的桌面开发 ,同时确保单个组件勾选了 Windows 10 SDK (10.0.19041.0)
  2. 安装好Windows10 SDK后,需要在控制面板程序和功能里找到相关软件,右键更改,然后勾选Debugging Tools for Windows,点击Change将下载安装相应功能
  3. 安装好 vscode ,方便之后的文件编辑
  4. 将系统语言设置成英文,方法如下:

(1)打开Windows 设置,选择时间和语言

(2)选择区域选项,将国家或地区设置成美国

(3)选择语言选项,点击添加语言,选择英语(美国),下一步勾选设置为我的Windows显示语言

(4)完成语言包的切换后会要求注销账户,根据提示注销

(5)重新登录账户

(6)回到刚才的语言选项,点击管理语言设置

(7)点击更改系统区域设置,选择英语(美国),勾选 Bate 版:使用 Unicode UTF-8 提供全球语言支持 选项

(8)点击确定,按照提示重启系统,重启完成后会将语言设置成英文

  1. 在D盘新建CEF_Build文件夹,之后所有的文件都放到里面

二、下载工具

1、下载工具depot_tools.zip,然后解压到D:\CEF_Build\depot_tools路径

2、将D:\CEF_Build\depot_tools添加到环境变量

3、在depot_tools目录下使用cmd执行update_depot_tools.bat,将会自动安装需要的软件

4、将 automate-git.py 脚本下载到D:\CEF_Build\automate\automate-git.py

三、下载源码

automate目录下创建脚本文件update.bat,写入以下内容:

@echo off
set GN_DEFINES=is_component_build=true
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
python automate-git.py --download-dir=D:\CEF_Build\chromium_git --depot-tools-dir=D:\CEF_Build\depot_tools --branch=4430 --no-update --no-depot-tools-update --no-distrib --no-build --force-clean
pause

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

双击运行update.bat以下载源码

参数说明:

download-dir: 代码下载目录

depot-tools-dir: 工具目录

branch: 要编译的分支,可以参考Current Release Branches (Supported) — Bitbucket

–no-update:不更新Chromium或CEF

–no-depot-tools-update:不更新depot-tools

–no-distrib:不打包

–no-build:不编译

–force-clean:强制清理Chromium和CEF,这将触发一个新的更新、构建和发布

注:更多参数可以使用命令python automate-git.py --help查看

四、修改源码

源码修改是在90.6.7.4430版本上进行的

H.264支持

1、修改D:\CEF_Build\chromium_git\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py

找到configure_flags['Chrome'].extend,修改为如下

configure_flags['Chrome'].extend([
    '--enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv',
    '--enable-demuxer=aac,mp3,mov,avi,amr,flv',
    '--enable-parser=aac,h264,mpegaudio,mpeg4video,h263',
])

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

configure_flags[‘Chrome’].extend([
‘–enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv’,
‘–enable-demuxer=aac,mp3,mov,avi,amr,flv’,
‘–enable-parser=aac,h264,mpegaudio,mpeg4video,h263’,
])

configure_flags[‘Chrome’].extend([
’–enable-decoder=aac,h264,mp3,mpeg4,amrnb,amrwb,flv’,
’–enable-demuxer=aac,mp3,mov,avi,amr,flv’,
’–enable-parser=aac,h264,mpegaudio,mpeg4video,h263’,
])

2、修改D:\CEF_Build\chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h

找到宏**#define CONFIG_SIPR_PARSER**设置成1

H.265支持

1、修改chromium_git\chromium\src\third_party\ffmpeg\ffmpeg_generated.gni

if ((is_mac) || (is_win) || (use_linux_config)) {
  ffmpeg_c_sources += [   
    "libavcodec/autorename_libavcodec_hpeldsp.c",
    "libavcodec/autorename_libavcodec_videodsp.c",
    "libavcodec/autorename_libavcodec_vp3dsp.c",
    "libavcodec/autorename_libavcodec_vp8dsp.c",
    "libavcodec/h264pred.c",
    "libavcodec/vp3.c",
    "libavcodec/vp3_parser.c",
    "libavcodec/vp56rac.c",
    "libavcodec/vp8.c",
    "libavcodec/vp8_parser.c",
  ]
  ffmpeg_c_sources += [
    "libavcodec/bswapdsp.c",
    "libavformat/avc.c",
    "libavcodec/dynamic_hdr10_plus.c",
    "libavcodec/autorename_libavcodec_hevcdec.c",
    "libavcodec/hevc_cabac.c",
    "libavcodec/hevc_data.c",
    "libavcodec/hevc_filter.c",
    "libavcodec/hevc_mvs.c",
    "libavcodec/hevc_parse.c",
    "libavcodec/hevc_parser.c",
    "libavcodec/hevc_ps.c",
    "libavcodec/hevc_refs.c",
    "libavcodec/hevc_sei.c",
    "libavcodec/hevcdsp.c",
    "libavcodec/hevcpred.c",
    "libavcodec/x86/bswapdsp_init.c",
    "libavcodec/x86/hevcdsp_init.c",
    "libavformat/autorename_libavformat_hevc.c",
    "libavformat/hevcdec.c",
  ]
  ffmpeg_asm_sources += [
    "libavcodec/x86/bswapdsp.asm",
    "libavcodec/x86/hevc_deblock.asm",
    "libavcodec/x86/hevc_idct.asm",
    "libavcodec/x86/hevc_mc.asm",
    "libavcodec/x86/hevc_add_res.asm",
    "libavcodec/x86/hevc_sao.asm",
    "libavcodec/x86/hevc_sao_10bit.asm",
  ]
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

2、修改chromium_git\chromium\src\third_party\ffmpeg\ffmpeg_options.gni

# if (is_chrome_branded) {
#   _default_ffmpeg_branding = "Chrome"
# } else {
#   _default_ffmpeg_branding = "Chromium"
# }

# if (is_chromeos && is_chrome_branded) {
#   _default_ffmpeg_branding = "ChromeOS"
# }

# if (is_chromecast) {
#   if (is_android) {
#     _default_ffmpeg_branding = "Chrome"
#   } else {
#     # TODO(alokp): What audio codecs does Chromecast want here?  Sort
#     # out and add configs if necessary.  http://crbug.com/570754
#     _default_ffmpeg_branding = "ChromeOS"
#   }
# }
+ _default_ffmpeg_branding = "Chrome"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

[外链图片转存中…(img-559m7loM-1653713307624)]

3、复制并重命名这个文件里的两个文件 chromium_git\chromium\src\third_party\ffmpeg\

  • libavcodec/hevcdec.c => libavcodec/autorename_libavcodec_hevcdec.c
  • libavformat/hevc.c => libavformat/autorename_libavformat_hevc.c

4、修改这两个文件,把下面几个的值配成 1:

  • chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.asm
  • chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h
define CONFIG_HEVC_DECODER 1
define CONFIG_HEVC_DEMUXER 1
define CONFIG_HEVC_PARSER 1
// 增加下下面的宏
define CONFIG_MP4_DEMUXER 1

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavcodec\codec_list.c

添加以下内容

&ff_hevc_decoder

  • 1
  • 2

6、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavcodec\parser_list.c

添加以下内容

&ff_hevc_parser

  • 1
  • 2

7、修改:src\third_party\ffmpeg\chromium\config\Chrome\win\x64\libavformat\demuxer_list.c

添加以下内容

&ff_hevc_demuxer

  • 1
  • 2

8、修改:chromium_git\chromium\src\build\config\features.gni

# Note: this flag is used by WebRTC which is DEPSed into Chrome. Moving it
# out of //build will require using the build_overrides directory.
# proprietary_codecs = is_chrome_branded || is_chromecast
+ proprietary_codecs = true

  • 1
  • 2
  • 3
  • 4
  • 5

[外链图片转存中…(img-4puuamAQ-1653713307625)]

9、修改: chromium_git\chromium\src\media\media_options.gni

# Enable HEVC/H265 demuxing. Actual decoding must be provided by the
# platform. Enabled by default for Chromecast, Chrome OS protected media and
# fuzzer builds.
# enable_platform_hevc =
#     proprietary_codecs &&
#     (is_chromecast || use_chromeos_protected_media || use_fuzzing_engine)
+ enable_platform_hevc = true

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

[外链图片转存中…(img-vgmQ3zY0-1653713307625)]

10、修改:chromium_git\chromium\src\media\BUILD.gn,注释掉里面一个判断

if (proprietary_codecs && media_use_ffmpeg) {
  # assert(
  #     ffmpeg_branding != "Chromium",
  #     "proprietary codecs and ffmpeg_branding set to Chromium are incompatible")
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

[外链图片转存中…(img-fm2Kx338-1653713307625)]

11、修改:chromium_git\chromium\src\media\base\supported_types.cc

bool IsDefaultSupportedVideoType(const VideoType& type) {
  //...
  switch (type.codec) {
    // ....
    case kCodecVP9:
      // Color management required for HDR to not look terrible.
      return IsColorSpaceSupported(type.color_space) &&
             IsVp9ProfileSupported(type.profile);
    case kCodecH264:
+   case kCodecHEVC:
    case kCodecVP8:
    case kCodecTheora:
      return true;

//     case kCodecHEVC:
// #if BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
//       return IsColorSpaceSupported(type.color_space) &&
//              IsHevcProfileSupported(type.profile);
// #else
//       return false;
// #endif
    case kUnknownVideoCodec:
    case kCodecVC1:
    case kCodecMPEG2:
    case kCodecDolbyVision:
      return false;
    // ...
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

[外链图片转存中…(img-EkAoAUnR-1653713307626)]

注意:

编译了支持HEVC解码的版本后,使用html5test.com测试还是提示不支持H.265,原因如下:

html5test.com 上检测浏览器是否支持HEVC是用 video.canPlayType() 检查以下两种codec是否支持而确定浏览器是否支持H.265的:
video/mp4; codecs=“hvc1.1.L0.0”
video/mp4; codecs=“hev1.1.L0.0”

但是在Chromium源码 media\base\video_codes.cc 中(90.6.7.4430版本):

// The specification for HEVC codec id strings can be found in ISO IEC 14496-15
// dated 2012 or newer in the Annex E.3
bool ParseHEVCCodecId(…) { … }

给出的codec是:

video/mp4; codecs=“hev1.1.2.L93.B0”

video/mp4; codecs="hev1.A4.41.H120.B0.23

这两个值是不符合 ISO IEC 14496-15 规范的(参考Annex E.3),因此会显示不支持。实际上是可以播放HEVC文件的。

这两个codec在macOS Safari 13.0.4上是有效的,可以被识别的。

五、编译

1、生成工程

automate目录下创建脚本文件create.bat,写入以下内容:

@echo off
set GN_DEFINES=proprietary_codecs=true ffmpeg_branding=Chrome is_official_build=true is_debug=false target_cpu=x64 symbol_level=0 enable_nacl=false use_jumbo_build=true
set GN_ARGUMENTS=--ide=vs2019 --sln=cef --filters=//cef/*
cd ..\chromium_git\chromium\src\cef
call cef_create_projects.bat
pause

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

双击运行create.bat将生成工程,生成的路径在D:\CEF_Build\chromium_git\chromium\src\out

GN_DEFINES 参数介绍:

ffmpeg_branding和proprietary_codecs 表示开启多媒体编解码支持,但默认仅支持一小部分,想要支持更多就是修改 ffmpeg 配置。

is_official_build 决定了是否是编译正式版本,指定该参数为 true 基本上都是为了产品发布使用,同时也会在创建解决方案的时候生成带有 sandbox 的解决方案(如 Release_GN_x64_sandbox),而不指定这个参数是没有的。

use_jumbo_build 官方资料默认指定,表示是否启用试验性的 jumbo 编译,编译过程会加快很多(至少快 1 小时),但是占用 CPU 和内存(尤其是内存)会剧增。

is_component_build 官方资料默认指定,但我们没有开启,这个参数表示是否启用组件化编译,设置为 true 以后,base、ffmpeg 等等都会被编译为动态库,使用时也是动态链接,编译出来的 cef_sandbox 只有几兆大小,并且你需要复制很多 dll 文件到项目目录下才能运行。

enable_nacl 禁用本机客户端 大多数开发人员通常不需要测试本机客户端功能,可以通过禁用它来加快构建速度。

symbol_level 设置从 0(无符号或最小符号)到 2(完整符号)不等。较低的级别使调试几乎不可能,但构建速度会快得多。在某些情况下,如果您只想尽快进行构建(许多构建机器人都这样做),它可能很有用

注:详情可以查询官方介绍GN 构建配置 (chromium.org)

2、开始编译

automate目录下创建脚本文件build.bat,写入以下内容:

@echo off
cd ..\chromium_git\chromium\src
echo StartTime %date% %time:~0,2%:%time:~3,2%:%time:~6,2%
ninja -C out\Release_GN_x64 cef
IF ERRORLEVEL 1 goto END
ninja -C out\Release_GN_x64_sandbox cef_sandbox
:END
echo EndTime %date% %time:~0,2%:%time:~3,2%:%time:~6,2%
pause

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

双击运行build.bat将进行编译

注意:如果系统里已经安装了python3,需要卸载掉,否则会冲突报错!

3、打包

automate目录下创建脚本文件distrib.bat,写入以下内容:

@echo off
cd ..\chromium_git\chromium\src\cef\tools
call make_distrib.bat --ninja-build --minimal --x64-build
pause

  • 1
  • 2
  • 3
  • 4
  • 5

双击运行distrib.bat将进行打包,打包完成后可以在chromium_git\chromium\src\cef\binary_distrib下找到打包的文件

4、测试

编译成功后将 libcef.dll 复制出来替换掉就可以,可以使用以下网址判断是否支持 H.264H.265 :

https://mgh.cool:9000/hevctest/index.html

参考链接

  1. cef / wiki / Windows Setup — Bitbucket
  2. cef / wiki / Windows Configuration — Bitbucket
  3. cef / wiki / Current Release Branches (Supported) — Bitbucket
  4. Windows下编译cef使其支持H.264 - 简书 (jianshu.com)
  5. CEF3 源码编译支持H264(win) - 知乎 (zhihu.com)
  6. 修改Chromium源码,实现HEVC/H.265 4K视频播放_前端_SijieCai_InfoQ精选文章
  7. Chrome 浏览器支持4k/h265的定制开发 (qq.com)
  8. cef_enhancement/HEVCDecoder at master · epubcn/cef_enhancement (github.com)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/912500
推荐阅读
相关标签
  

闽ICP备14008679号