视频直播系列(三):音视频开源库编译

上文讲到,在Java层采集到数据以后传递给native层,在C语言中处理数据,视频采用H264编码,音频采用aac编码,使用rtmpdump推流

视频解析开源库准备

说明

视频编码为H264,使用ffmpeg可以完成,但这显得有点大材小用,这里选择x264这个开源编码库进行调用,X264是遵循H264编码标准的函数库

步骤

  • 下载x264源代码,在linux系统下使用git下载
    下载地址:x264下载地址

    1
    git clone http://git.videolan.org/git/x264.git
  • 下载完成,进入目录,编写编译脚本

    1
    vim android_build.sh

编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
CPU=arm
NDK_HOME=/usr/ndk/android-ndk-r10e
SYSROOT=$NDK_HOME/platforms/android-9/arch-$CPU
TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
PREFIX=$(pwd)/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
function build_x264
{
./configure \
--prefix=$PREFIX \
--enable-static \
--disable-asm \
--disable-cli \
--enable-debug \
--enable-pic \
--host=arm-linux \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT
}
build_x264
make clean
make -j4
make install

这里编译的是一个静态库,为了使项目生成的库尽可能的少,这种属于功能的一个子功能编译成一个库就够了
添加执行权限

1
chmod 755 android_build.sh

编译生成.a静态库

1
./android_build.sh

顺利的话就生成静态库了,将生成的静态库以及头文件放入项目的jni目录中

音频解析开源库准备

说明

音频采用AAC编码,如同H264一样,这里也使用一个开源编码库:FAAC

步骤

  • 下载faac源代码
    下载地址:faac下载地址
    此处不要下载zip格式压缩包,里面没有configure文件

  • 下载完成,进入目录,编写编译脚本

    1
    vim android_build.sh

编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
NDK_HOME=/usr/ndk/android-ndk-r10e
CPU=arm
PLATFORM=$NDK_HOME/platforms/android-9/arch-$CPU/
TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
PREFIX=$(pwd)/android/$CPU
function build_faac
{
CFLAGS="-fpic -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP "
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
export CPPFLAGS="$CFLAGS"
export CFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS"
export CXX="${CROSS_COMPILE}g++ --sysroot=${PLATFORM}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${PLATFORM}"
export NM="${CROSS_COMPILE}nm"
export STRIP="${CROSS_COMPILE}strip"
export RANLIB="${CROSS_COMPILE}ranlib"
export AR="${CROSS_COMPILE}ar"
./configure --prefix=$PREFIX \
--without-mp4v2 \
--enable-static \
--disable-shared \
--host=arm-linux
}
build_faac
make clean
make -j4
make install

添加执行权限

1
chmod 755 android_build.sh

编译生成.a静态库

1
./android_build.sh

将生成的静态库(在lib目录下)以及头文件(在include目录下)放入项目的jni目录中

推流静态库准备

说明

由于rtmpdump并不能通过脚本的方式得到静态库,这里需要移植到Android平台

移植步骤

  • 下载rtmpdump源代码
    下载地址:rtmpdump下载地址
    这里通过链接最新能够下载2.3版本,通过git下载则可以下载到2.4

  • 下载Polar SSL(现改名为mbedtls)
    下载地址:Polar SSL下载地址
    这里要注意了,只有1.2.19及以前的版本编译后生成才是polarssl目录

  • 配置交叉编译环境

    1
    (NDK所在目录)/build/tools/make-standalone-toolchain.sh platform=android-8 --install-dir=(项目所在目录)/android-toolchain --system=linux-x86_64

如果出现以下提示:

1
Unable to auto-config arch from toolchain

那么此时修改make-standalone-toolchain.sh文件,找到

1
TOOLCHAIN_NAME=

将其修改为(因为我这里是编译arm,所以这样填)

1
TOOLCHAIN_NAME=arm-linux-androideabi-4.8

命令执行成功会有以下提示:

1
2
3
4
5
6
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying c++ runtime headers and libraries...
Copying files to: /usr/libso/rtmpdump/android-toolchain
Cleaning up...
Done.

期中/usr/libso/rtmpdump/为我的项目所在目录,并在此目录下有android-toolchain文件夹生成

  • 设置环境变量
    由于在编译过程中使用了CC,RL,AR,所以一一指定路径会很麻烦,这里采用设置临时环境变量的方法(直接在命令行中输入,可用echo $PATH查看设置情况)

    1
    export PATH=/usr/libso/rtmpdump/android-toolchain/bin:$PATH
  • 编译Polar SSL及安装

    1
    2
    make CC=arm-linux-androideabi-gcc APPS=
    make install DESTDIR=/usr/libso/rtmpdump/android-toolchain/sysroot

编译前将include/polarssl/config.h中的#define POLARSSL_HAVEGE_C的注释去掉,否则编译librtmp的时候会出现undefined reference tohavege_random错误,这里是因为polarssl默认关闭了havege模块

  • 编译rtmpdump生成静态库
    1
    make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/usr/libso/rtmpdump/android-toolchain/sysroot/include" CRYPTO=POLARSSL SHARED=

如果要生成动态库,那么使用以下命令

1
make SYS=android CROSS_COMPILE=arm-linux-androideabi- INC="-I/usr/libso/rtmpdump/android-toolchain/sysroot/include" CRYPTO=POLARSSL

根据Makefile,生成静态库文件包括librtmp.a rtmp_sys.h rtmp.h log.h amf.h,且都位于librtmp目录下
将生成的静态库以及头文件放入项目的jni目录中

Donate comment here