Android RTMP直播的例子:CameraStreaming

jopen 8年前

CameraStreaming 是一个Android(4.0以上)摄像头实时输出到RTMP服务器的直播演示

在网上找了一圈,关于Android 直播的实现,大都指向RTP/RTSP方式的直播。经过一番摸索,踩了不少坑。

  1. libstreaming 这个库提供了一个很好的RTP/RTSP直播基础。然而它在Android 5.0上不能使用,原因是Android5.0对于LocalSocket的使用做了安全限制。解决的办法是改用ParcelFileDescriptor;
  2. RTMP协议的实现,在网上找的一个开源的实现,基本可以使用。关于RTMP协议的详细信息可以阅读一下rtmp_specification_1.0.pdf这里有一个blog介绍这个协议,也可以参考我另外开源的一个C++实现的RTMP客户端
  3. MediaRecorder得到的MP4格式的视频流其实并不适合直播的,因为,MP4文件会在文件技术的时候才写入SPS(序列参数值)和 PPS(图片参数集),而SPS和PPS是解码的关键信息,我们直播的时候必须先发送SPS和PPS,后续的视频流才能被服务器正确的接受和处理。参考了 libstreaming的做法:先录一个小视频存到sdcard,然后解析这个视频文件,就能取得SPS和PPS,然后把着两个参数保存到 Setting里头,后面再次直播的时候就直接从Setting得到SPS和PPS。后续真正直播就直接使用这个SPS和PPS了(这里有个疑问:SPS 和PPS是固定的吗?)
  4. 视频流的封装格式:4字节的长度(注意是big endian)接NALU数据,NALU的第一个字节是头信息,它的语法如下:

    +---------------+  |0|1|2|3|4|5|6|7|  +-+-+-+-+-+-+-+-+  |F|NRI|  Type  |  +---------------+
  5. 音频流格式:

  6. RTMP的一些限制:目前测试的结果发现(没有找到相关的规范):
    • 必须使用44.1K的采样率
    • 必须使用双通道立体声格式
    • 必须使用16位的编码深度。

项目主页:http://www.open-open.com/lib/view/home/1449997851726