视频编码库-x264简介及交叉编译

一、简介

        H.264ITU(International Telecommunication Union,国际通信联盟)和MPEG(Motion Picture Experts Group,运动图像专家组)联合制定的视频编码标准。而x264是一个开源的H.264/MPEG-4 AVC视频编码函数库,是最好的有损视频编码器之一。

1.1 基本信息   

        H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准里称为H.264,在MPEG的标准里是MPEG-4的一个组成部分--MPEG-4 Part 10,又叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。

H.264编码能实现非常好的压缩比,有广泛的适用码率(适于从超低码率低延迟的电话会议到高码率的BluRay光盘和HDTV码流),良好的硬件支持(以PSP、iPod和显卡DXVA为代表)和众多强大的厂商作后盾。

x264始于2003年,从当开源社区的MPEG4-ASP编码器Xvid小有所成时开始的,经过几年的开发,特别是Dark Shikari加入开发后,x264逐渐成为了最好的视频编码器。

1.2 功能   

        x264提供了一个命令行接口以及一组应用程序接口(API)。前者在许多图形用户界面软件中得到应用,如Staxrip和MeGUI。后者也在许多其他类型到软件中调用,如HandBrake和FFmpeg。

        x264具备的H.264标准定义的特性,较之其他H.264编码器而言多出许多。H.264编码器之间的特性比较,可以参见:

        x264包含有一些心理视觉增强技术,以增强编码视频的主观质量。

        x264能够在普通计算机上实现多路高清视频的实时编码。

        x264也是第一个免费的蓝光视频编码器。2010年4月,x264项目组宣布蓝光格式视频编码功能完成,使得x264成为首个免费的蓝光视频编码器。

1.3 性价比

        同样的片源、码率、编码器默认设置下,用x264编码出的视频(一般是mkv或者mp4格式)一定会比rmvb画质更好(264高级参数发挥的作用)。还有请扔掉“mkv版一定会很大,rmvb一定会很小”的错误观念,一般来说用于收藏的mkv版才会很大!

        接上补充 H.264是一种编码方式 而RMVB是一种封装格式完全没有可比性 常见的编码方式和封装格式有

h263:FLV

x264:MP4/MKV/F4V

R10/R9/R40:RMVB/RM

XVID/DIVX:AVI

如果对结论有所怀疑,可以自行做实验对比,但是必须保证条件公平,即输入编码器的视频(片源)必须相同,对画面所做的处理必须相同(也就是不可以一个锐化一个不锐化这样的),输出的视频的码率必须相同或者相差极小。因为要对比的是x264与编码rmvb的软件,对照实验应该尽可能排除其他因素的干扰。

1.4 特点

  • 8x8与4x4自适应空间域转换
  • 自适应B帧选择
  • B帧可作为参考帧/自由的帧顺序
  • CAVLC/CABAC熵编码
  • 自定义精确的矩阵模板
  •  I帧:所有宏块格式(16x16, 8x8, 4x4, 以及有全部预测的PCM)
  • P帧:所有的分割块(从16x16到4x4)
  • B帧:分割块从16x16到8x8(包括skip/direct)
  • 隔行扫描(MBAFF)
  • 多个参考帧
  • 码率控制:固定量化,固定质量,一次或者多次编码的平均码率,可选的VBV参数
  • 场景变换检测
  • B帧时间域、空间域direct模式自适应选择
  • 可在多个CPU平行编码
  • 预测性的无损编码(x264似乎也是所有基于H.264标准的编码器中唯一实现这项的)
  • 心理视觉优化,保留更多的细节(自适应量化,psy-RD,psy-trellis)
  •  可用于手动调整码率分配的zones参数

二、编译

2.1 源码地址

x264官方地址为:

https://www.videolan.org/developers/x264.html

通过以下命令下载源码:

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

2.2 编译环境:

本人使用的MAC电脑进行编译,mac 版本号为: Mac os 12.6.7

编译前需要准备好ndk工具,NDK 版本为:/Users/Library/Android/sdk/ndk/21.0.6113669

2.3 修改配置

        修改x264源码根目录下的configure中的这一行,改成下图这个样,不然生成的库的名字会是libx264.so.164 (Android系统是不识别这种命名的动态库的)

2.4 编译

在根目录下新建build_android.sh 文件,文件内容如下:

#!/bin/sh

# --- 脚本信息 Start ---
version="0.0.1(1)"
# --- 脚本信息 End ---


# --- 输入参数指定 Start ---
# lame库目录
libDir="/Users/xxx/Documents/projectc/x264"
# ndk目录
ndkDir="/Users/xxx/Library/Android/sdk/ndk/21.0.6113669"
# 输出的库目录
productRootDir="/Users/xxx/Documents/projectc/x264/android"
# 架构
archs="armeabi-v7a arm64-v8a x86 x86_64"
# api等级
androidApiLevel="21"
# --- 输入参数指定 End ---

for arch in ${archs}
do
    echo "comile arch: ${arch}"

    case $arch in
    armeabi-v7a)
        archHost="armv7a-linux-androideabi"
        crossCompile="arm-linux-androideabi"
    ;;

    arm64-v8a)
        archHost="aarch64-linux-android"
        crossCompile=${archHost}
    ;;

    x86)
        archHost="i686-linux-android"
        crossCompile=${archHost}
    ;;

    x86_64)
        archHost="x86_64-linux-android"
        crossCompile=${archHost}
    ;;
    *)  echo "Parameter is not valid."
        exit
    ;;
esac

export CC="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${archHost}${androidApiLevel}-clang"
export CXX="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${archHost}${androidApiLevel}-clang++"
prebuilt="${ndkDir}/toolchains/llvm/prebuilt/darwin-x86_64"
export AS=${prebuilt}/bin/${crossCompile}-as
export LD=${prebuilt}/bin/${crossCompile}-ld
export NM=${prebuilt}/bin/${crossCompile}-nm
export STRIP=${prebuilt}/bin/${crossCompile}-strip
export RANLIB=${prebuilt}/bin/${crossCompile}-ranlib
export AR=${prebuilt}/bin/${crossCompile}-ar

productDir="${productRootDir}/${arch}"
rm -rf ${productDir}
mkdir ${productDir}

cd ${libDir}

# config
./configure \
--host=${archHost} \
--enable-shared \
--disable-static \
--target=android \
--disable-frontend \
--enable-static \
--disable-asm \
--enable-pic \
--prefix="${productDir}"

# make
make clean
make -j8
make install


done

在根目录下运行如下命令:

./build_android.sh

2.5编译结果

编译完成以后,可以在android 目录下看到生成的头文件和动态库,如下:

三、参考文献

1. x264 百度百科

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值