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基本调用流程
推流:视频+音频
视频: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 |
版权声明: 此文章版权归Jack Ou所有,如有转载,请註明来自原作者