多路音视频上传观看技术难点
1、android音视频采集,音频audioRecorder采集microphone数据,视频编写AbstractCamera实现类采集camera数据。2、android音视频编码,可以直接使用开源强大的ffmpeg编解码库,视频libx264,音频libfaac 。技术点:ffmpeg在linux的安装编译,jni调用ffmpeg编译得到的so库3、rtmp协议封装,rtmp封装编码后
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博客里的,为了理解方便,就拿来用了,
其实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
可能有很多地方还有问题,在编码过程中慢慢发现并纠正。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)