1、android音视频采集,音频audioRecorder采集microphone数据,视频编写AbstractCamera实现类采集camera数据。

2、android音视频编码,可以直接使用开源强大的ffmpeg编解码库,视频libx264,音频libfaac 。技术点:ffmpeg在linux的安装编译,jni调用ffmpeg编译得到的so库

3、rtmp协议封装,rtmp封装编码后的h264,、aac流。技术点:了解rtmp协议格式,参考文章http://www.cnweblog.com/fly2700/archive/2008/04/09/281431.html

如果觉得那篇文章全文字难懂,可以看看http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html 。其实看完这2篇介绍,我的个人理解,不知道是否正确。

       符合rtmp协议的音视频流,包括rtmp包头,AMF数据2大部分。

       完整的RTMP包头有12字节,由下面5个部分组成:

用途大小(Byte)含义
Head_Type1包头
TIMER3时间戳
AMFSize3数据大小
AMFType1数据类型
StreamID4流ID

 其中AMFType可以指定传输的类型,比如是单纯的视频流,单纯的音频流,或者音视频流。在这里是音视频流,其数值为0X16。

 

AMF数据, AMF有AMF0和AMF3 两种版本,只是细微的数据类型定义有点差异。以音视频流为例,那么在这里AMF数据肯定包括视频流数据,音频流数据2部分。如下图,这个图是http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html博客里的,为了理解方便,就拿来用了,

 

其实AMF数据就是多个videoTag和audioTag组合起来的。videoTag和audioTag结构见上图,codecFlag其实就是标志位,标志这是一个新的videoTag或audioTag。

 

AVCPacketType图还是借用别人的,

AACPacketType

 

这里的timestamp应该是相对时间戳,为了保证音视频的同步。

最后才是真正的数据。

         这一部分对我来说,是个棘手的技术难点。

 

4.android客户端通过rtmp协议与Red5服务器交互,暂时用juv-rtmp-client包,虽然我已经破解成功了,但以后还是考虑怎么实现该交互方式。c语言有开源的librtmp包,到时候看看它是如何实现的,借鉴其思路。

          MPConnectionUtil.netStream.publish("ccc", NetStream.RECORD);

5、Red5服务器接收音视频流保存成flv文件格式存储,并提供直播,暂时参考oflaDemo这个服务器应用程序。技术点:Red5 1..1安装与配置,阅读Red5源代码了解其流媒体服务器实现原理

6、view端,如果要想浏览器通过flash player播放,这里涉及到flex与服务器的交互,flex负责生成所见的swf,html页面就可以通过swf实现客户所见的页面。其实就是播放

ns.play(http://someServer.someDomain.com/flash/video/orientation.flv); 技术点:flex的学习使用
 
7、android客户端,设计简易的rtmp播放器播放rtmp流,技术点:了解rtmp协议交互的几个步骤。
 

 

参考文章

http://www.cnweblog.com/fly2700/category/17076.html

http://www.cnblogs.com/haibindev/archive/2012/04/16/2450989.html

 

可能有很多地方还有问题,在编码过程中慢慢发现并纠正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐