1. 程式人生 > >在Windows上編譯 CEF3 且加入mp3/mp4的支援

在Windows上編譯 CEF3 且加入mp3/mp4的支援

現在因為工作需要,為了得到支援mp3、mp4的cef32和64位版本,需要編譯cef3,本次編譯版本是3239(6.0.3239.132)。

一、編譯條件
1.可用的shadowsocks,用於穩定的翻牆
2.Win7或者更新的系統,必須64位,至少8GB的RAM,我採用win10 64位,16GRAM
3.比較新的VS,最近免費的社群版(編譯不同版本要求不一樣,具體看Cef官網幫助,我用的是VS2017),需要安裝“C++桌面元件” 和 “MFC和ATL支援”,最好安裝在預設路徑,VS2017還需要特殊配置
4.Win10 SDK(官方10.0.15063,VS2017中有)
5.至少100G剩餘空間(官方要求),NTFS檔案系統,部分檔案超過4G,部分資料顯示最少60G,編譯結束後發現遠超60G

二、準備工作
1.設定系統區域為英語(美國)。(控制面板-區域-管理-更改系統區域設定-英語(美國)),設定完需要重啟
2.建立工作目錄,路徑不能包含空格及特殊字元。例如e:\cef
3.下載編譯工具包,解壓至工作目錄。例如e:\cef\depot_tools
4.下載編譯指令碼至工作目錄。例如e:\cef\
5.在工作目錄下建立原始碼目錄。例如e:\cef\source
6.新增系統環境變數

     set CEF_USE_GN=1
        set GN_DEFINES=is_official_build=true
        set GYP_DEFINES=buildtype=Official
        set
GYP_MSVS_VERSION=2017 set CEF_ARCHIVE_FORMAT=tar.bz2

    Path新增e:\cef\depot_tools,為避免與已安裝的python或git衝突,寫在path靠前位置。
 若環境變數設定後任有問題,在cmd使用set設定,例如:set DEPOT_TOOLS_WIN_TOOLCHAIN=0

    完整目錄結構:
    e:/ 
        cef/
            automate-git.py
            depot_tools/
            source/

三、設定代理
1.shadowsocks設定為全域性模式
2.開啟具有管理員許可權的cmd,輸入如下指令

    >netsh
    netsh>winhttp
    netsh winhttp>
    netsh winhttp>
    netsh winhttp>set proxy 127.0.0.1:1080

其中127.0.0.1:1080為代理的IP地址和埠號。
設定完成後,退出該cmd就可以了。該設定使固化在系統,重新啟動之後,該設定依然有效。
3.設定http代理和Git代理
在CMD中輸入:

>set http_proxy=http://127.0.0.1:1080
>set https_proxy=http://127.0.0.1:1080
>set socks5_proxy=socks5://127.0.0.1:1080

為git設定代理
a)使用http/https代理伺服器

>git config --global http.proxy %http_proxy%
>git config --global https.proxy %https_proxy%

或者:b)使用socks5代理伺服器

>git config --global http.proxy %socks5_proxy%
>git config --global https.proxy %socks5_proxy%

驗證git代理
設定完後,用下面命令看是否成功:

>git config --get http.proxy
>git config --get https.proxy

4.設定Boto代理
建立.boto檔案

[Boto]
proxy = 127.0.0.1
proxy_port = 1080

在cmd中set NO_AUTH_BOTO_CONFIG=E:\cef\.boto,.boto位置任意
用來下gs://開頭的檔案,千萬127.0.0.1前不要加http://!!!網上很多教程此次加了http://,導致無法使用。這個配置不好gs://開頭的檔案會下載失敗,網上gs://替換為https://storage.googleapis.com/ 在瀏覽器下載的方案我只能下載前面一部分檔案,中間有一步會清除目錄下的檔案,重新下載。

四、檢出程式碼

1.切換到工作目錄e:\cef
2.使用命令下載原始碼

python automate-git.py --download-dir=e:\cef\source --branch=3239 --no-build --no-distrib --force-clean

其中–branch=3239是指定要下載的Cef版本;
–no-build –no-distrib是隻下載程式碼而不編譯;
–force-clean這個引數用於清理Chromium和Cef的一些檢出資訊,如果沒有一次性下載成功而再次執行下載命令時,需要帶上這個引數來清理一些資訊,否則檢出會失敗(第一次下載時直接帶上這個引數也可以)。
下載和編譯只需要這個一個指令碼就可以,指令碼會自動下載depot_tools 、Chromium、Cef等原始碼。如果下載過程中出現錯誤,就再次執行這個命令直到下載完成。
網路調通以後不會有太多問題,下載時間和網路速度有關,我用了5個小時多些全部下載完成。

五、編譯程式碼

1.新增MP3、MP4支援

source\chromium\src\third_party\ffmpeg\chromium\scripts\build_ffmpeg.py

      configure_flags['Chrome'].extend([  
          '--enable-decoder=aac,h264,mp3',  
          '--enable-demuxer=aac,mp3,mov',  
          '--enable-parser=aac,h264,mpegaudio',  
      ]) 

改為

     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',  
      ])  

分別開啟e:\cef\source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\ia32\config.h
e:\cef\source\chromium\src\third_party\ffmpeg\chromium\config\Chrome\win\x64\config.h,在原有配置巨集FFMPEG_CONFIGURATION裡增加以下:

    –enable-decoder=’rv10,rv20,rv30,rv40,cook,h263,h263i,mpeg4,msmpeg4v1,msmpeg4v2,msmpeg4v3,amrnb,amrwb,ac3,flv’ –enable-demuxer=’rm,mpegvideo,avi,avisynth,h263,aac,amr,ac3,flv,mpegts,mpegtsraw’ –enable-parser=’mpegvideo,rv30,rv40,h263,mpeg4video,ac3’

上面是通過查資料修改的,修改後編譯能通過,沒有報錯,但是沒有MP3、MP4支援。下面指令設定後再次編譯便有了MP3、MP4支援,所以上面的這些有沒有用不敢確定
下面的指令,很重要!!!
set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome

2.windows 構建指令設定

//為保險再設定一次
set CEF_USE_GN=1
set GN_DEFINES=is_official_build=true   
//set GN_DEFINES=is_official_build=true proprietary_codecs=true ffmpeg_branding=Chrome 新增MP3、MP4支援 使用此條指令
set GYP_DEFINES=buildtype=Official    
//set GYP_DEFINES=proprietary_codecs=1 ffmpeg_branding=Chrome 此條指令可能是以前版本用來新增MP3、MP4支援
set GYP_MSVS_VERSION=2017
set CEF_ARCHIVE_FORMAT=tar.bz2

set GYP_GENERATORS=ninja,msvs-ninja
set GN_ARGUMENTS=--ide=vs2017 --sln=cef --filters=//cef/*
//VS2017安裝在預設目錄,但任然需要下面設定,可能是由於VS2015和VS2017同時安裝,路徑根據自己的安裝目錄和版本確定
set WIN_CUSTOM_TOOLCHAIN=1
set CEF_VCVARS=none
set GYP_MSVS_OVERRIDE_PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
set SDK_ROOT=C:\Program Files (x86)\Windows Kits\10
set INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\atlmfc\include;%INCLUDE%
set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\HostX64\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.13.26020\x64\Microsoft.VC141.CRT;%PATH%
set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x86;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\lib\x86;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\atlmfc\lib\x86;%LIB%
set VS_CRT_ROOT=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\crt\src\vcruntim

此處參考資料
3.Bug修改
可以跳過,直接編譯,等bug出現再查詢相應解決方案。
編譯過程中如果出現bug導致編譯過程結束,一方面看cmd的輸出,可能提供解決方案,還可以檢視src\build-3239-release.log檔案,搜尋關鍵字FAILED來查詢發生錯誤的檔案
以下是我出現的問題:
錯誤

FAILED: obj/cef/chrome_elf_set/content_switches.obj
FAILED: obj/cef/chrome_elf_set/crash_keys.obj

解決方案
在cef/BUILD.gn檔案中,查詢 “chrome_elf_set”,在其子節點deps下新增”//media:media_features” 。
參考資料
4.編譯程式碼
開啟cmd切換到工作目錄,然後輸入命令來編譯

python automate-git.py --download-dir=e:\cef\source --branch=3239 --no-update --no-debug-build --build-log-file --verbose-build --force-distrib --force-build

其中–no-update是讓指令碼不再更新程式碼,因為已經下載完畢了;
–no-debug-build是隻編譯release版本,這樣編譯速度會快很多,–no-release-build可以只編譯debug版本;
–force-distrib –force-build用於強制編譯cef程式碼;
–build-log-file –verbose-build用於輸出編譯日誌到e:\cef\source目錄,名字為build-3239-release.log,編譯發生錯誤,可以開啟這個日誌檔案並通過搜尋關鍵字FAILED來查詢發生錯誤的檔案;
如果需要64位版本,則新增–x64-build引數且設定下列環境變數

set PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Redist\MSVC\14.13.26020\x64\Microsoft.VC141.CRT;%PATH%
set LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\lib\x64;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\atlmfc\lib\x64;%LIB%
set INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\include;C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.13.26128\atlmfc\include;%INCLUDE%

編譯第一次大概有6、7個小時,第二次以後2、3個小時

六.編譯完成

  • 輸出目錄為source\chromium\src\out\Release_GN_x86 和 source\chromium\src\cef\binary_distrib,Release_GN_x86下有cefclient.exe可以測試,binary_distrib下有cef_binary_3.3239.1723.g071d1c1_windows32.tar.bz2
  • chrome://version檢視版本

chrome://version