在音视频开发中,通常需要将颜色空间模型YUV、RGB数据编码成MPEG、H.26X系列的视频编码。
视频相关知识
颜色空间模型YUV和RGB
YUV:也称为YCrCb,是欧洲电视系统所采用的一种颜色编码方法,是PAL和SECAM模拟彩色电视制式才用的颜色空间模型。其中Y代表亮度,UV代表色差,U和V是构成颜色的两个分量。通常有YUV444、YUV422、YUV420P、YUV420SP、NV21、NV12等格式,这些格式的区别在于YUV的比例(数量)不同和排列顺序的不同。
RGB:通过对红、绿、篮3个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。RGB格式有:RGB555、RGB565、RGB24、RGB32等。
视频编码
MPEG系列:(由ISO[国际标准化组织]下属的MPEG[运动图像专家组]开发)视频编码方面主要是MPEG1(VCD)、MPEG2(DVD使用)、MPEG4(DVDRIP)、MPEG4 AVC(热门)。
H.26X系列:(由ITU[国际电传视讯联盟]主导,侧重网络传输,只有视频编码)包括H.261、H.262、H.263、H.263+、H.263++、H.264、H.265等,目前来说H.264最为流行,而最新的H.265对硬件的需求还是比较大。
x264编译
x264是一个优秀的H.264编码器,同样的,如果我们想要在Android中使用x264,那么我们就需要将其编译成.so动态库或者静态库。这里选择编译.so动态库。
- 到官网下载x264源码(或者通过git来进行下载),并解压
# git clone https://code.videolan.org/videolan/x264.git
解压:
tar -xjf x264.tar.bz2
- 创建build_x264.sh脚本文件,并通过Vim写入如下内容:
#!/bin/bash
NDK=/usr/ndk/android-ndk-r14b
configure()
{
CPU=$1
PREFIX=$(pwd)/android/$CPU
HOST=""
CROSS_PREFIX=""
SYSROOT=""
if [ "$CPU" == "armv7-a" ]
then
HOST=arm-linux
SYSROOT=$NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
HOST=aarch64-linux
SYSROOT=$NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
./configure \
--prefix=$PREFIX \
--host=$HOST \
--enable-pic \
--enable-strip \
--enable-thread \
--enable-asm \
--enable-shared \
--disable-static \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic" \
--extra-ldflags="" \
}
build()
{
make clean
cpu=$1
echo "build $cpu"
configure $cpu
#-j<CPU核心数>
make -j4
make install
}
build arm64
build armv7-a
脚本文件中创建了configure()和build()两个方法,configure()方法主要是调用configure脚本文件并配置对应的选项来完成编译;build()方法则是调用configure()和配置系统架构。
- 给脚本添加执行权限,并执行
chmod +x build_x264.sh
./build_x264.sh
编译完成后,就得到.so动态库,至于x264的使用,则在后续文章中进行讲解。