RTMP、X264与交叉编译
与HTTP(超文本传输协议)同样是一个基于TCP的Real Time Messaging Protocol(实时消息传输协议)。由Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的一种开放协议 。在国内被广泛的应用于直播领域。HTTP默认端口为80,RTMP则为1935。
本质上我们通过阅读Adobe的协议规范,通过与服务器建立TCP通信,根据协议格式生成与解析数据即可使用RTMP进行直播。当然我们也可以借助一些实现了RTMP协议的开源库来完成这一过程。
RTMPDump
RTMPDump 是一个用来处理RTMP流媒体的开源工具包。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。
RTMPDump源码下载:http://rtmpdump.mplayerhq.hu/download/rtmpdump-2.3.tgz
交叉编译
在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。但是首先必须得进行交叉编译。
RTMPDump源码结构如下:
在根目录下提供了一个Makefile
与一些.c
源文件。这里的源文件将会编译出一系列的可执行文件。然后我们需要的并不是可执行文件,真正的对RTMP的实现都在librtmp子目录中。在这个子目录中同样包含了一个Makefile
文件。通过阅读Makefile
发现,它的源码并不多:OBJS=rtmp.o log.o amf.o hashswf.o parseurl.o
。因此我们不进行预编译,即直接放入AS中借助CMakeLists.txt
来进行编译。这么做可以让我们方便的对库本身进行调试或修改(实际上我们确实会稍微修改这个库的源码)。
在AS中复制librtmp置于:src/main/cpp/librtmp
,并为其编写CMakeLists.txt
#预编译宏
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO" )
#所有源文件放入 rtmp_source 变量
file(GLOB rtmp_source *.c)
#编译静态库
add_library(rtmp STATIC ${rtmp_source} )
在app/CMakeLists.txt
中导入这个CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
#导入其他目录cmakelist
add_subdirectory(src/main/cpp/librtmp)
add_library(XXX SHARED ...)
#XXX需要链接rtmp库
target_link_libraries(XXX rtmp ...)
RTMP视频数据
RTMP视频流格式与FLV很相似,通过查看FLV的格式文档,就能够知道RTMP视频数据应该怎么拼接。
RTMP中的数据就是由FLV的TAG中的数据区构成。
FLV tags 结构
字段 | 字节 | 描述 |
---|---|---|
类型 | 1 | 0x08: 音频 0x09: 视频 0x12: 脚本(描述信息) |
数据大小 | 3 | 数据区的大小,不包括包头。 |
时间戳 | 3 | 当前帧相对时间戳,单位是毫秒。相对于第一个TAG时戳。 |
时戳扩展 | 1 | 如果时戳大于0xFFFFFF,将会存在字节。 |
流ID | 3 | 总是0 |
数据区 | n | 音、视频包 |