上文讲到,在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
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
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
6Copying 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
2make 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目录中