Windows 编译 QWebEngine 支持 MP4 播放(5.7.1 & 5.12.3)

参考链接

  1. https://blog.csdn.net/saga1979/article/details/51734001
  2. https://stackoverflow.com/questions/50510457/how-to-compile-qt-webengine-5-11-on-windows-with-proprietary-codecs

背景描述

使用 QWebEngine 播放 mp4 视频,在 Win10 上可以播放, Win7 上则播放不了。
查询资料发现,需要自己编译 Qt WebEngine 并添加解码器。

Audio and Video Codecs
Qt WebEngine supports the MPEG-4 Part 14 (MP4) file format only if the required proprietary audio and video codecs, such as H.264 and MPEG layer-3 (MP3), have been enabled. Proprietary codecs can be enabled by passing the following option to qmake when building Qt WebEngine:

qmake WEBENGINE_CONFIG+=use_proprietary_codecs

Qt 5.7.1

编译环境及相关软件说明

  1. Qt 5.7.1 http://download.qt.io/archive/qt/5.7/5.7.1/
  2. VS2013 https://msdn.itellyou.cn/
  3. Python 2.7.13 https://www.python.org/downloads/windows/
  4. Perl (Strawberry vesion) http://strawberryperl.com/
  5. Bison and flex from https://sourceforge.net/projects/winflexbison/ (将 win-bison.exe 和 win-flex.exe 改名为 bison.exe 、 flex.exe)
  6. Gperf http://gnuwin32.sourceforge.net/packages/gperf.htm

注意:将相关 exe 路径加入到环境变量 Path 中

源码下载及处理

获取 Qt 5.7.1 源码方式:

  1. 安装 Qt 时选择安装源码;
  2. 单独下载源码(我使用此方式),http://download.qt.io/archive/qt/5.7/5.7.1/single/

注意:源码存放路径不要太深,有可能导致编译时文件名过长而失败。我放在 E:\QtSrc

源码中一些文件需要改成 utf-8 bom 格式。需要修改的文件列表如下:

E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\openmax_dl\dl\api\omxtypes.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\snappy\src\snappy-stubs-internal.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\qcms\src\qcms.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\harfbuzz-ng\src\hb-private.hh
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\harfbuzz-ng\src\hb-ot-head-table.hh
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\harfbuzz-ng\src\hb-ot-layout-common-private.hh
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\harfbuzz-ng\src\hb-ot-shape-complex-indic.cc
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\harfbuzz-ng\src\hb-ot-shape-complex-thai.cc
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\aead.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\engine.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\crypto\cmac\cmac.c
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\crypto\rsa\internal.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\skia\src\effects\skdisplacementmapeffect.cpp
E:\QtSrc\qtwebengine\src\3rdparty\chromium\crypto\p224.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\crypto\p224.cc
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\libxslt\libxslt\xslt.c
E:\QtSrc\qtwebengine\src\3rdparty\chromium\net\quic\crypto\crypto_handshake_message.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\media\formats\mp2t\ts_section_pmt.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\libjingle\source\talk\app\webrtc\dtmfsender.cc
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\re2\src\re2\unicode_casefold.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\v8\src\parsing\parser.cc
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\curve25519.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\ssl.h
E:\QtSrc\qtwebengine\src\3rdparty\chromium\url\scheme_host_port.h

将文件列表保存为文件 1.txt。 新建 1.py,内容如下:

import sys
import os
import codecs
import chardet
 
def utf8_converter(file_path , universal_endline =True ):
    # Read from file
    print("file:"+ file_path)
    file_open = open(file_path, "rb")
    raw = file_open.read()
    encoding_name = chardet.detect(raw)[ 'encoding']
    print(encoding_name )
    file_open.close()
    # Decode
    raw = raw.decode(encoding_name)
    # Remove windows end line
    if universal_endline:
        raw = raw.replace( '\r\n', '\n')
    # Encode to UTF-8-sig
    raw = raw.encode('utf-8-sig')
 
    file_open = open(file_path, 'wb')
    file_open.write(raw)
    file_open.close()
    return 0
 
if __name__ == '__main__' :
    file = sys.argv[1].encode('unicode_escape')
    f = open(sys.argv[1], "r")
    s = f.read()
    files = s.split("\n")
    for file in files:
        utf8_converter(file, False)
    f.close()

注意,需要先安装 chardet 模块

pip.exe install chardet

然后执行

python.exe .\1.py .\1.txt

编译

  1. 打开 VS2013 x86 命令行工具,或者执行如下命令(根据自己 VS2013 安装的路径修改)

“D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat” x86

  1. 切换到 QWebEngine 源码路径,执行 qmake

cd E:\QtSrc\qtwebengine
qmake.exe WEBENGINE_CONFIG+=use_proprietary_codecs

  1. 编译,根据自己实际情况修改命令

“D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\nmake.exe”

前后我编译加修改编译错误用了大概 4 个小时。

下载地址

链接:https://pan.baidu.com/s/1ZZi_VVZjxNI19N5ebk9HUQ
提取码:fzan

Qt 5.12.3

编译环境及相关软件说明

  1. Qt 5.12.3 http://download.qt.io/archive/qt/5.12/5.12.3/
  2. VS2017 https://msdn.itellyou.cn/

    注意1:其他相关 exe 可以通过上面方法添加,或者 使用Qt 源码里提供的 /path/to/src/gnuwin32/bin
    注意2:VS2017安装时,需要选择 Windows 10 SDK,版本 10.0.16299及以上都可以

源码下载及处理

下载 Qt 5.12.3 源码,需要修改的文件列表如下(同 5.7.1 并去掉了 5.12.3中没有的文件):

E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\openmax_dl\dl\api\omxtypes.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\snappy\src\snappy-stubs-internal.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\qcms\src\qcms.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\aead.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\engine.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\crypto\cmac\cmac.c
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\crypto\p224.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\crypto\p224.cc
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\media\formats\mp2t\ts_section_pmt.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\re2\src\re2\unicode_casefold.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\v8\src\parsing\parser.cc
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\curve25519.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\third_party\boringssl\src\include\openssl\ssl.h
E:\QtSrc5.12.3\qtwebengine\src\3rdparty\chromium\url\scheme_host_port.h

编译

  1. 打开 Qt 5.12.3(MSVC 2017 32-bit) 命令行工具,执行如下命令(根据自己 VS2017 安装的路径修改)

“C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\Build\vcvarsall.bat” amd64_x86
注意:我用这种方法,解决了 qmake 时 “Needs Visual Studio 2017 or higher QtWebEngine will not be built.”错误

  1. 切换到 QWebEngine 源码路径,执行 qmake

cd E:\QtSrc5.12.3\qtwebengine
D:\Qt\Qt5.12.3\5.12.3\msvc2017\bin\qmake.exe – -webengine-proprietary-codecs

  1. 编译,根据自己实际情况修改命令

“C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\nmake.exe”

前后我编译加修改编译错误用了大概 10多个小时。

下载地址

链接:https://pan.baidu.com/s/1oT82JaVLdqIk6RszV-XXAQ
提取码:j0wx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章