编译x264视频编码库

13 篇文章 2 订阅
9 篇文章 1 订阅

       X264作为H264视频编码最好用的有损视频软编码器之一,其性能比FFmpeg中实现的内置编码算法性能更好,其功能强大无以言表。但遗憾的是只能编码为H264,无法编码为H265等其他视频编码格式,本章主要实现通过使用X264源码编译出android中可以使用的X264编码器。

一、下载

X264官网地址:https://www.videolan.org/developers/x264.html

这里使用ubuntu命令行下载

1. 因为x264是使用git来管理的,所以如果没有安装git工具的,需要先安装git,命令如下

sudo apt-get install git

2. 获取x264包

git clone https://code.videolan.org/videolan/x264.git

 

二、编译

1.执行cd x264打开文件夹

2.执行configure --help查看可配置项,如下

Standard options:
  --prefix=PREFIX          install architecture-independent files in PREFIX
                           [/usr/local]
  --exec-prefix=EPREFIX    install architecture-dependent files in EPREFIX
                           [PREFIX]
  --bindir=DIR             install binaries in DIR [EPREFIX/bin]
  --libdir=DIR             install libs in DIR [EPREFIX/lib]
  --includedir=DIR         install includes in DIR [PREFIX/include]
  --extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
  --extra-rcflags=ERCFLAGS add ERCFLAGS to RCFLAGS

Configuration options:
  --disable-cli            disable cli
  --system-libx264         use system libx264 instead of internal
  --enable-shared          build shared library
  --enable-static          build static library
  --disable-bashcompletion disable installation of bash-completion script
  --enable-bashcompletion  force installation of bash-completion script
  --bashcompletionsdir=DIR install bash-completion script in DIR [auto]
  --disable-opencl         disable OpenCL features
  --disable-gpl            disable GPL-only features
  --disable-thread         disable multithreaded encoding
  --disable-win32thread    disable win32threads (windows only)
  --disable-interlaced     disable interlaced encoding support
  --bit-depth=BIT_DEPTH    set output bit depth (8, 10, all) [all]
  --chroma-format=FORMAT   output chroma format (400, 420, 422, 444, all) [all]

Advanced options:
  --disable-asm            disable platform-specific assembly optimizations
  --enable-lto             enable link-time optimization
  --enable-debug           add -g
  --enable-gprof           add -pg
  --enable-strip           add -s
  --enable-pic             build position-independent code

Cross-compilation:
  --host=HOST              build programs to run on HOST
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

External library support:
  --disable-avs            disable avisynth support
  --disable-swscale        disable swscale support
  --disable-lavf           disable libavformat support
  --disable-ffms           disable ffmpegsource support
  --disable-gpac           disable gpac support
  --disable-lsmash         disable lsmash support

 

其中:

--prefix  设置编译结果输出目录,一般规范都会存在这个参数
--exec-prefix 参数表示我们可以借助这个对编译器(gcc/clang)设置选项 (类似javac设置-classpath)
--disable-cli 这个配置是关闭编译敲命令行工具,在Android是自己编译代码,用不到,也可以不管,倒库的是后不用就好
--enable-shared & --enable-static 这两个参数是指我们编译成静态库.a 还是动态库.so

--enable-pic 压制警告,在android中如果不压制警告,编译时没问题,运行时一旦产生警告会导致程序崩溃

--host 运行平台(armabi-v7a、armabi-v8a等)

--cross-prefix 工具编译链

--sysroot 为编译时指定了逻辑目录

 

(备:这里解释一下动态库和静态库的区别:
_1.静态库(可以理解为组件化,打包的时候必须在一起):

        xxxx.c 生成xxxx.a 里面函数
        编译时,从xxxx.a 中找到这个函数,与xxxx.c 一起生成一个 a.so
        最终 可能 .a 库 10M

_2.动态库(可以理解为插件化,需要的时候去下载):

        xxxx.a 生成xxxx.so 里面函数
        编译时,只会找有没有这个函数,有就行不做其他操作
        运行时,当a.so  执行到这个函数,在动态去找对应的函数
        最终,会有两个so .so 6M   a.so 5M. 加起来会稍微大一点

言归正传,这里由于配置命令较长,为防止命令敲错重复修改麻烦,我写一个脚本用来执行

3.执行sudo vim generate.sh创建编辑脚本文件,并编辑如下内容,编辑完成保存(注:文件中换行前需使用\转义,否则命令行会当作回车执行命令)

如果还没有下载NDK,请参考上一章先下载NDK,并配置交叉编译环境变量,否则无法使用

#!/bin/bash
 

export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=22

function build
{
  ./configure \
    --prefix=$PREFIX \
    --disable-cli \
    --enable-static \
    --enable-pic \
    --host=$HOST \
    --cross-prefix=$CROSS_PREFIX \
    --sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \

        make clean
        make -j8
        make install
}
#armeabi-v7a
PREFIX=./armeabi-v7a
HOST=armv7a-linux-android
export TARGET=armv7a-linux-androideabi
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-

build

如需要编译arm64-v8a架构版本,则修改以下变量:

#arm64-v8a
PREFIX=./android/arm64-v8a
HOST=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-

4.执行./generate.sh命令,如果执行成功,会在目录下生成对应prefix的目录,如:armeabi-v7a目录

 

注:这里遇到了一个坑,花了我大半天的时间解决,运行脚本的时候总是提示No working C compiler found,这里要注意两点:

_1.确保NDK路径已经配置环境变量和已经重载配置的环境变量,且路径地址准确

_2.确保脚本中API=xx的值与所下载的NDK版本对应

如果保证了这两项都没错,还是报错的话,打开x264的config.log文件,里面有报错的详细信息,可供参考

 

5.打开armeabi-v7a目录,里面会出现include和lib目录,include文件夹中存放生成的x264的头文件,lib文件夹中存放x264的.a或.so文件,到此,x264视频编码库编码完成,在安卓中使用时,直接拷贝armeabi-v7a即可

 

本章内容介绍结束。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NDK是Android Native Development Kit的缩写,它是一套专门为Android平台提供的用于开发底层C/C++代码的工具集。使用NDK可以实现直接在Android上编译C/C++的动态。而x265是一种现代化的视频编码技术,它可以在保证视频质量的基础上压缩视频大小。 使用NDK直接编译x265的动态需要以下步骤: 1. 下载并安装NDK,并将其添加到环境变量中。 2. 下载x265源码,并解压到本地路径。 3. 打开终端窗口,进入x265源码路径,执行以下命令: ``` $ export NDK_ROOT=/path/to/ndk $ export PATH=$NDK_ROOT:$PATH $ export SYSROOT=$NDK_ROOT/platforms/android-xx/arch-arm64/ $ export CC=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc $ export CXX=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++ $ export LD=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld $ export AR=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar $ export AS=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-as $ export RANLIB=$NDK_ROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ranlib ``` 其中,将`/path/to/ndk`替换成NDK的安装路径,将`android-xx`替换成对应的Android API版本。 4. 执行以下命令进行编译: ``` $ ./configure --disable-asm --prefix=/path/to/output --host=aarch64-linux-android $ make -j4 $ make install ``` 其中,将`/path/to/output`替换成自己想要输出的路径。 5. 编译完成后,可以将输出的动态文件拷贝到Android项目中,并在项目中调用该文件。 通过以上步骤,就可以在Android平台上使用NDK直接编译x265的动态了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值