MSYS2环境下编译X265
HEVC(High Efficiency Video Coding),是一种新的视频压缩标准。可以替代H.264/ AVC编码,使得保持相同质量的情况下,体积减少40%左右。目前有多种实现版本,x265则是其中之一。常用网站:
1 2 3 4 | x265官网 http: //www.x265.org/ 代码托管 https: //bitbucket.org/multicoreware/x265/ 代码镜像 http: //www.videolan.org/developers/x265.html。 编译好的可执行档 http: //x265.ru/en/ |
本文提供一个在Windows平台下的MSYS2环境进行编译x265的方法.
1)MSYS2的下载安装,以及需要用的软件安装,请参考博文http://www.cnblogs.com/eudiwffe/p/6249630.html
必备软件:
1 2 3 4 | Make MSYS2-base自带 CMake 2.8以上版本 https: //cmake.org/ (请安装windows版) YASM 1.2及以上 http: //yasm.tortall.net/ MingW-Gcc 4.8以上版本 推荐使用http: //xhmikosr.1f0.de/tools/msys |
注意:make已经包含在MSYS2中,无须安装;CMake请下载windows版本安装,不要使用msys2的版本;yasm用于生成汇编文件,可以手动下载并拷贝到/usr/bin/yasm.exe中,也可以使用msys2中的pacman进行在线安装;mingw-gcc推荐使用手动下载并覆盖。其中windows版cmake安装后,可能在msys2环境中找不到,需要手动添加到PATH中,具体为在bash中执行“export PATH=/cmake-winverion/:$PATH”。
2)x265源码下载,可以从两个代码托管中下载最新的release版本;也可以通过HG进行克隆软件仓库,具体方法在msys2中执行:
1 2 3 4 | pacman -S mercurial # 安装mercurial Hg分布式软件仓库管理 hg clone https: //bitbucket.org/multicoreware/x265 # 克隆软件仓库 cd x265 # 进入到x265中 hg update stable # 切换到稳定版本 |
即可。如果已经克隆了仓库,可以在x265目录下执行“hg pull && hg update stable”进行更新到最新版本。
如果windows中已经安装了TortoiseHg并且不想在msys2中再安装msys2版本的hg,可以执行“export PATH=/yourhgpath/:$PATH”将其加入到环境变量中。
3)编译
在编译之前,请确认一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $ echo $PATH .:/c/Program Files (x86)/CMake/bin:/mingw32/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/System32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl $ which make /usr/bin/make $ which cmake /c/Program Files (x86)/CMake/bin/cmake $ which yasm /usr/bin/yasm $ which hg /usr/bin/hg |
如果有软件找不到或路径不对,可以手动修复。
进入build/msys后执行“./make-Makefiles.sh”进行生成生成Makefile,期间会弹出CMake对话框,一般可以点击“configure”然后“generate”即可生成Makefile,最后执行make进行编译。
执行./make-x86_64-w64-mingw32-Makefiles.sh可以生成编译64位版本x265的Makefile,在这之前,请清理编译中间文件,否则cmake不会生成新的Makefile。
4)MSYS2下的HG问题:
如果使用的是hg克隆软件仓库的源码编译,可能会出现如下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -- Found yasm: C:/msys2x86/usr/bin/yasm.exe (found version "1.3.0" ) -- Found Yasm 1.3.0 to build assembly primitives -- hg found at C:/msys2x86/usr/bin/hg -- x265 version +- -- The ASM_YASM compiler identification is unknown -- Found assembler: C:/msys2x86/usr/bin/yasm.exe -- Looking for strtok_r -- Looking for strtok_r - not found CMake Error at CMakeLists.txt:529 (list): list GET given empty list CMake Error at CMakeLists.txt:530 (list): list GET given empty list -- Looking for include file getopt.h -- Looking for include file getopt.h - found -- Configuring incomplete, errors occurred! See also "C:/msys2x86/home/user/x265/build/msys/CMakeFiles/CMakeOutput.log" . See also "C:/msys2x86/home/user/x265/build/msys/CMakeFiles/CMakeError.log" . |
这是因为在生成Makefile之前,cmake会根据hg软件自动获取当前代码版本。如果你使用的是tortoisehg并且将其添加到PATH中了,则没有问题;如果使用的是msys2-hg(即使用Pacman在线安装mercurial),cmake将无法正确获得版本号。因为source/cmake/version.cmake中使用了“execute_process”获取版本,而windows版本的cmake只能调用原生的win执行档,msys2版本的hg使用的是Python2构建的,所以无法正常执行“execute_process”,因此需要手动获取当前x265的版本,并保存在x265/.hg_archival.txt中,以及在x265/source/cmake/version.cmake的最后部分增加部分代码,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | hg log -r. -- template {node} hg log -r. -- template {node} hg log -r. -- template {branch} hg log -r. -- template {latesttag} hg log -r. -- template {latesttagdistance} ## x265/.hg_archival.txt repo: 6dd8f6a41db17a30b5dc14218acc4065dee7f465 node: be14a7e9755e54f0fd34911c72bdfa66981220bc branch: stable tag: 2.2 distance: 1 ## x265/source/cmake/version.cmake最后增加: # msys hg cannot get correct version info set(X265_LATEST_TAG "2.2" ) set(X265_TAG_DISTANCE "1" ) set(X265_REVISION_ID "be14a7e9755e" ) set(X265_VERSION "2.2+1-be14a7e9755e" ) message(STATUS "msys hg x265 version ${X265_VERSION}" ) |
由于每次编译都需要进行上面操作,可以写一个脚本放在x265/build/msys/make-version.sh中:
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 46 47 48 49 50 51 52 | #!/bin/sh ## MSYS HG cannot get repo version, so read info ## from .hgtags and save to .hg_archival HG_TAGS= "../../.hgtags" HG_ARCHIVAL= "../../.hg_archival.txt" CMAKE_VERSION= "../../source/cmake/version.cmake" PATCH= "# msys hg cannot get correct version info" REPO=`hg log -r. -- template {node}` NODE=`hg log -r. -- template {node}` BRANCH=`hg log -r. -- template {branch}` TAG=`hg log -r. -- template {latesttag}` DISTANCE=`hg log -r. -- template {latesttagdistance}` ## find current branch node and tag cat $HG_TAGS > $HG_ARCHIVAL while read oneline do if [ "${oneline#* }" = "$TAG" ] then NODE=${oneline% *} break fi done < $HG_ARCHIVAL ## for mercurial ## find current version.cmake end rm -rf $CMAKE_VERSION.bak cat $CMAKE_VERSION > $HG_ARCHIVAL while read oneline do if [ "$oneline" = "$PATCH" ] then break fi echo "$oneline" >> $CMAKE_VERSION.bak done < $HG_ARCHIVAL echo "$PATCH" >> $CMAKE_VERSION.bak echo "set(X265_LATEST_TAG \"$TAG\")" >> $CMAKE_VERSION.bak echo "set(X265_TAG_DISTANCE \"$DISTANCE\")" >> $CMAKE_VERSION.bak echo "set(X265_REVISION_ID \"${NODE:0:12}\")" >> $CMAKE_VERSION.bak echo "set(X265_VERSION \"$TAG+$DISTANCE-${NODE:0:12}\")" >> $CMAKE_VERSION.bak echo "message(STATUS \"msys hg x265 version \${X265_VERSION}\")" >> $CMAKE_VERSION.bak rm -rf $CMAKE_VERSION mv $CMAKE_VERSION.bak $CMAKE_VERSION ## for release echo repo: $REPO > $HG_ARCHIVAL echo node: $NODE >> $HG_ARCHIVAL echo branch: $BRANCH >> $HG_ARCHIVAL echo tag: $TAG >> $HG_ARCHIVAL echo distance: $DISTANCE >> $HG_ARCHIVAL |
以后当更新源码后,再次编译时,首先执行./make-version.sh,生成patch,然后进行编译即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!