一、简介
H.264是ITU(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也是第一个免费的蓝光视频编码器。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 百度百科

1615

被折叠的 条评论
为什么被折叠?



