1.Rtmp下载与介绍

[1] http://rtmpdump.mplayerhq.hu/ 【rtmp官网】【LibRTMP】

[2] http://rtmpdump.mplayerhq.hu/download 【rtmp下载中心】

[3] https://www.videolan.org/developers/x264.html 【x264官网】

2.RTMP基本调用流程

RTMP基本调用流程.png

推流:视频+音频
视频:Camera采集 –> 封装(压缩) —> rtmp包 —> 发送服务器
音频:AudioRecord –> 封装(压缩) —> rtmp包 —> 发送服务器

3.RtmpDump集成部署。

RTMPDump
是一个用来处理RTMP流媒体的开源工具包。 它能够单独使用进行RTMP的通信, 也可以集成到 FFmpeg中通过FFmpeg接口来使用RTMPDump。
源码下载:http://rtmpdump.mplayerhq.hu/download

在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。
在根目录下提供了一个Makefile与一些.c源文件。这里的源文件将会编译出一系列的可执行文件。 然后我们需要的并不是可执行文件,真正的对RTMP的实现都在librtmp子目录中。在这个子目录 中同样包含了一个Makefile文件。通过阅读Makefile发现,它的源码并不多:OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o。因此我们不进行预编译,即直接放入AS中借助CMakeLists.txt来进 行编译。这么做可以让我们方便的对库本身进行调试或修改(实际上我们确实会稍微修改这个库的 源码)。

4. X264交叉编译与集成部署

1
git clone https://code.videolan.org/videolan/x264.git
1
--disable-cli   # disable cli Android用不了,直接关掉
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
# 脚本
#!/bin/bash

NDK_ROOT=/home/jackou/tools/android-ndk-r17c

CPU=arm-linux-androideabi

TOOLCHAIN=$NDK_ROOT/toolchains/$CPU-4.9/prebuilt/linux-x86_64

ANDROID_API=17

PREFIX=./android/armeabi-v7a

./configure \
--prefix=$PREFIX \
--disable-cli \
--enable-static \
--enable-pic \
--host=arm-linux \
--cross-prefix=$TOOLCHAIN/bin/$CPU- \
--sysroot=$NDK_ROOT/platforms/android-$ANDROID_API/arch-arm \
--extra-cflags="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=$ANDROID_API -U_FILE_OFFSET_BITS -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC -I$RTMP/include" \

make clean
make install
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 编译全包
#!/bin/bash
NDK=/home/jackou/tools/android-ndk-r17c

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 \
--disable-cli \
--enable-static \
--enable-neon \
--extra-cflags="-isysroot $NDK/sysroot -isystem $NDK/sysroot/usr/include/aarch64-linux-android -fPIE -pie" \
--extra-ldflags="-fPIE -pie" \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT
}

build()
{
make clean
cpu=$1
echo "build $cpu"

configure $cpu
#-j<CPU核心数>
make -j4
make install
}

build arm64
build armv7-a

5.faac交叉编译

1
2
# 下载地址
wget https://udomain.dl.sourceforge.net/project/faac/faac-src/faac-1.29/faac-1.29.9.2.tar.gz

编译arm-v7a库

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

NDK_ROOT=/home/jackou/tools/android-ndk-r17c

# 这个是最终输出成功的路径
PREFIX=`pwd`/android/armeabi-v7a

TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi

FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=17 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC"

export CC="$CROSS_COMPILE-gcc --sysroot=$NDK_ROOT/platforms/android-17/arch-arm"
export CFLAGS="$FLAGS"


./configure \
--prefix=$PREFIX \
--host=arm-linux \
--with-pic \
--enable-shared=no

make clean
make install

编译arm64-v8a库

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
#!/bin/bash
NDK=/home/jackou/tools/android-ndk-r17c

API=28

echo "开始编译中 NDK=$NDK"

CPU=armv8-a
TOOLCHAIN=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64
CROSS_COMPILE=$TOOLCHAIN/bin/aarch64-linux-android
PREFIX=$(pwd)/android3/$CPU

FLAGS="-isysroot $NDK/sysroot -isystem $NDK/sysroot/usr/include/aarch64-linux-android -march=$CPU -O0 -fPIC"

export CC="$CROSS_COMPILE-gcc --sysroot=$NDK/platforms/android-$API/arch-arm64"
export CFLAGS="$FLAGS"

./configure \
--prefix=$PREFIX \
--host=aarch64-linux \
--with-pic \
--enable-shared=no

make clean
make install

RTMPPacket数据包有两个类型

数据类型 第一字节标注位 第二字节标注位 数据内容
解码信息 0xAF 0x00 解码数据
音频数据 0xAF 0x01 音频数据
5.1 Audio Tag

AF双声道
十六进制:0xAF ===> 二进制对比下图:1010 1111
1010 ==> 十进制等于10 ==> AAC
11 ==> 十进制等于3 ===> 3 = 44-kHz(对于AAC来说,该字段总是3)
1 ==> 十进制等于1 ===> 1 = snd16Bit(对于压缩过的音频来说,一般都是16bit) 1 ==> 十进制等于1 ===> 1 = sndStereo(对于AAC,总是1)双声道

AE单声道
十六进制:0xAE ===> 二进制对比下图:1010 1110
1010 ==> 十进制等于10 ==> AAC
11 ==> 十进制等于3 ===> 3 = 44-kHz(对于AAC来说,该字段总是3)
1 ==> 十进制等于1 ===> 1 = snd16Bit(对于压缩过的音频来说,一般都是16bit) 0 ==> 十进制等于0 ===> 0 = sndMono单声道

字段 占位 描述
SoundFormat 4 音频数据格式值:
0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8-kHz
15 = Device-specific sound
SoundRate 2 音频采样率值:
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz(对于AAC来说,该字段总是3)
SoundSize 1 采样长度值:
0 = snd9Bit
1 = snd16Bit(对于压缩过的音频来说,一般都是16bit
SoundType 1 音频类型(单声道还是双声道)值:
0 = sndMono 单声道
1 = sndStereo(对于AAC,总是1) 双声道
SoundData n 音频数据部分(AAC则需要参考下面AACAUDIODA 分)
5.2 AACAUDIODATA
字段 字节 描述
AACPacketType 1 0:AAC 序列头 1:AAC 数据
Data n 如果AACPacketType==0参考下面的 AudioSpecificConfig;
如果AACPacketType==1, AAC原始音频数据

AudioSpecificConfig

字段 占位符
audioObjectType 5
samplingFrequencyIndex 4
channelConfiguration 4
frameLengthFlag 1
dependsOnCoreCoder 1
extensionFlag 1