zoukankan      html  css  js  c++  java
  • MSYS2环境下编译X265

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

  • 相关阅读:
    普通javaBean获取Spring托管对象
    java 线程安全问题
    MySQL之alter语句用法总结
    Maven pom.xml配置
    Srping框架初识
    win7(64位)下memcache安装时报错“ failed to install service or service already installed”
    activemq 使用
    elasticsearch plugin
    logback.xml 实例
    Intellij IDEA 插件
  • 原文地址:https://www.cnblogs.com/eudiwffe/p/6252011.html
Copyright © 2011-2022 走看看