Chinaunix首页 | 论坛 | 博客
  • 博客访问: 733613
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: Android平台

2013-07-02 15:19:44

原文地址:http://blog.csdn.net/itachi85/article/details/8278362


下面是框架简图:



首先调用mediaRecorder.java中的方法比如start方法,会调用jni:


也就是调用android_media_recorder.cpp的start方法:


 接着到mediaRecorder.cpp,mediaRecorder是由mediaplayerService创建的,而mediaRecoder.cpp和mediaplayerService是通过binder机制来进行进程间的通信的,这时client端就是通过操作服务端返回的imediaRecorder来对服务端进行控制的:



这里new mediaRecorderClient这是其实是创建了一个StagefrightRecorder:



其实我们在java层调用start就是调用了StagefrightRecorder中的strat方法,在这里我们可以看到根据传进来的mOutputFormat值(输出格式)会选择不同的编码类型的方法:




假如我们输出的是3gp格式,我们调用:startMPEG4Recording() 方法:


接着调用setupMPEG4Recording:



这里有个setupVideiEncoder,看来这里应该是对视频编码的地方 根据不同的编码类型来设置不同的参数,这个方法代码有些多直截取部分代码:


来看看关键的一句,这里创建了OMXCodec 然后把创建了的编码器赋值给MediaSource,这里的MediaSource可以看作是OMXCodec的封装,这样编码器的准备工作就已经做好了:



接着我们回到startMPEG4Recording() 方法,可以看到这里在对解码器进行准备之后,建立了metadata,然后调用setupMPEG4MetaData来存储媒体信息到metadata中,最后我们调用MediaWriter的start方法开始进行编码:



这个是setupMPEG4MetaData方法用来存储媒体信息的各项参数:



接下来我们看看mediaWriter的start方法的实现,meidaWriter只是个描述的文件,我们调用的是实现了这个头文件的MPEG4Writer的start方法,这里截取我们关注的代码,这里开启了一个线程并调用了startTracks方法:



startTracks方法中的实现,建立了一个迭代器,不断的调用start方法:



这里的it就是Track类,我们看看Track类,他是MPEG4Writer的内部类:


接着看看Track类中start的实现,这里截取我们感兴趣的代码 原来调用的是MediaSource,我们前面说过MediaSource就是OMXCodec的封装,这下我们知道了前面是用来准备编码器的,这里开始调用编码器开始编码了,也就是说我们从mediaRecorder.java调用了start方法最终调用的就是OMXCodec.cpp的start方法:




阅读(3445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~