CameraStreaming

Introduction: Android RTMP 直播的例子(A demo for camera streaming H.264,AAC using RTMP on Android)
More: Author   ReportBugs   
Tags:

干什么的

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 介绍这个协议.
  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 位的编码深度。

Licensing

This streaming stack is available under two licenses, the GPL and a commercial license. If you are willing to integrate this project into a close source application, please contact me at dawenhing at gmail.com. Thank you.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools