CameraStreaming
Introduction: Android RTMP 直播的例子(A demo for camera streaming H.264,AAC using RTMP on Android)
Tags:
干什么的
CameraStreaming 是一个 Android(4.0 以上)摄像头实时输出到 RTMP 服务器的直播演示
在网上找了一圈,关于 Android 直播的实现,大都指向 RTP/RTSP 方式的直播。经过一番摸索,踩了不少坑。
- libstreaming 这个库提供了一个很好的 RTP/RTSP 直播基础。然而它在 Android 5.0 上不能使用,原因是 Android5.0 对于 LocalSocket 的使用做了安全限制。解决的办法是改用 ParcelFileDescriptor;
- RTMP 协议的实现,在网上找的一个开源的实现,基本可以使用。关于 RTMP 协议的详细信息可以阅读一下rtmp_specification_1.0.pdf,这里有一个 blog 介绍这个协议.
- MediaRecorder 得到的 MP4 格式的视频流其实并不适合直播的,因为,MP4 文件会在文件结束的时候才写入 SPS(序列参数值)和 PPS(图片参数集),而 SPS 和 PPS 是解码的关键信息,我们直播的时候必须先发送 SPS 和 PPS,后续的视频流才能被服务器正确的接受和处理。参考了 libstreaming 的做法:先录一个小视频存到 sdcard,然后解析这个视频文件,就能取得 SPS 和 PPS,然后把着两个参数保存到 Setting 里头,后面再次直播的时候就直接从 Setting 得到 SPS 和 PPS。后续真正直播就直接使用这个 SPS 和 PPS 了(这里有个疑问:SPS 和 PPS 是固定的吗?)
视频流的封装格式:4 字节的长度(注意是 big endian)接 NALU 数据,NALU 的第一个字节是头信息,它的语法如下:
+---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+-+ |F|NRI| Type | +---------------+
音频流格式:
- 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.