多路音视频上传观看技术难点

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_Type 1 包头
TIMER 3 时间戳
AMFSize 3 数据大小
AMFType 1 数据类型
StreamID 4 流ID

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

 

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

多路音视频上传观看技术难点_第1张图片

 

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

 

AVCPacketType图还是借用别人的,

多路音视频上传观看技术难点_第2张图片

AACPacketType

多路音视频上传观看技术难点_第3张图片

 

这里的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协议交互的几个步骤。
 
多路音视频上传观看技术难点_第4张图片

 

参考文章

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

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

 

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

你可能感兴趣的:(多路音视频上传观看技术难点)