HEVC(High Efficiency Video Coding),是一种新的视频压缩标准。可以替代H.264/ AVC编码,使得保持相同质量的情况下,体积减少40%左右。目前有多种实现版本,x265则是其中之一。常用网站:

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

必备软件:

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中执行:

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)编译

在编译之前,请确认一下:

$ 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克隆软件仓库的源码编译,可能会出现如下错误:

-- 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的最后部分增加部分代码,具体如下:

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中:

#!/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,然后进行编译即可。

MSYS2环境下编译X265的更多相关文章

  1. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  2. Redhat环境下编译安装Google Bazel

    Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...

  3. 在SoCEDS环境下编译和更新preloader和uboot程序的方法

    在SoCEDS环境下编译和更新preloader和uboot程序的方法   前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...

  4. Android 环境下编译FFmpeg

    Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1.    X2 ...

  5. centos7.6环境下编译安装tengine-2.2.2的编译安装

    centos7.6环境下编译安装tengine-2.2.2的编译安装 .获取tengine2..2的源码包 http://tengine.taobao.org/download/tengine-2.2 ...

  6. Boost学习总结(一)VS2010环境下编译STLport和Boost

    Boost学习总结(一)VS2010环境下编译STLport和Boost Boost简介 Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库.1998年,Beman G.Da ...

  7. 使用MSYS2环境中编译Qt5.5.0的补丁

    Qt的configure脚本对MinGW静态编译支持不太完善,总有这样那样的问题.如果你不嫌麻烦,而且可以接受高版本的Qt的话,可以考虑使用我做的补丁在MSYS2环境中编译.Qt5.4.2的补丁 Qt ...

  8. 在Tex live和Beamer环境下编译中文

    在Tex live和Beamer环境下编译中文时,容易出现缺少$的提示错误.它有可能是由于特殊字符所致,如下划线: 也有可能是插图有误所致.

  9. Suse环境下编译linux-2.6.24内核

    Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...

随机推荐

  1. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  2. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  3. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  4. 微信小程序前端源码逻辑和工作流

    看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...

  5. HTML5游戏源码 飞翔的字母 可自定义内容

    相信大家都玩过飞翔的小鸟吧,当然,可能已经有很多人因为这个游戏砸了不少手机.吼吼. 废话不多说,回到主题,源码如下. 博客园上传空间大小有限制,没法上传了,需要打包源码的朋友们请留言邮箱地址.当然还有 ...

  6. windows 7(32/64位)GHO安装指南(U盘制作篇)~

    本篇接着上篇的介绍,为同学讲解U盘启动盘的制作.虽然本篇大白菜的官网上也有类似的教程,但是为了完整性,我将在这里为大家细细的讲解.在这里说一下,系统包和软件包的下载大家可以自行下载,很简单的,小主就不 ...

  7. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》

    ---------------------------------------------------------------------------------------------------- ...

  8. BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 3522  Solved: 1041[Submi ...

  9. 瞬间记住Javascript中apply与call的区别

    关于Javascript函数的apply与call方法的用法,网上的文章很多,我就不多话了.apply和call的作用很相似,但使用方式有区别 apply与call的第一个参数都是一个对象,这个对象就 ...

  10. php杂记(二)

    1.获取客户端真实IP if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $onlineip = $_SERVER['HTTP_CLIENT_IP']; } else ...