最近杂七杂八的忙碌着,前几天看了下这部分主要是stagefright模块的,所以更改下名字

做了挺长时间的android平台的媒体开发,对之前的分析进行一个阶段性的总结。

一、android结构图(上下文关系)

二、android目录结构

自从android4.2版本之后,媒体的相关代码都放到framework/av/的目录中,俗称"AV工作者",呵呵(本地代码不是太健全,目录我手动敲,公司代码健全,直接导出目录树)

[plain] view plain copy print ?
  1. |-----media
  2. ||
  3. ||--libmedia_native//JNI交互部分,从名字可以看出来
  4. ||
  5. ||--libmedia//一个服务端的代理,对应用层提供相关的接口,和服务端交互
  6. ||
  7. ||--libmediaplayerservice//服务段(分发器,交换机的作用,个人理解)
  8. ||
  9. ||--libstagefright//一个服务端的分支,支持工作
  10. ||
  11. ||--mediaserver//媒体进程,管理媒体一些相关信息,关注较少
  12. ||
  13. ||--mtp//文件夹操作媒体的相关东西
  14. ||


再进一步,我们看一下stagefright的里面包括什么东东

[plain] view plain copy print ?
  1. |--stagefright
  2. ||
  3. ||--codecs//提供解码器实现
  4. ||
  5. ||--colorconversion//颜色空间转换
  6. ||
  7. ||--foundation//基本数据结构的实现
  8. ||
  9. ||--httplive//m3u8解析
  10. ||
  11. ||--id3//ID3TAG解析(一般用于MP3格式的metadata容器)
  12. ||
  13. ||--include//基本头文件
  14. ||
  15. ||--matroska//matroska文件解析
  16. ||
  17. ||--mpeg2ts//mpeg2ts文件解析和数据获取一些处理
  18. ||
  19. ||--mp4//MP4的格式解析
  20. ||
  21. ||--omx//IOMX接口实现
  22. ||
  23. ||--rtsp//rtsp文件解析
  24. ||
  25. ||--wifi-display//关于wifi的处理
  26. ||
  27. ||--yuv//YUV数据的处理
  28. ||


三、“演讲恐惧着”的接口事件

本地媒体的事件处理接口

stage fright英文的意思就:演讲恐惧者,AwesomePlayer 功能强大的播放器

在android中也是这个这样,“演讲恐惧者”有强大的接口和事件处理接口,但是,它不去实现,而是全部通过AwesomePlayer来完成的,在其初始化时,就直接实例化功能强大播放器并且对其设置监听。代码如下:

StageFrightPlayer.cpp

[cpp] view plain copy print ?
  1. StagefrightPlayer::StagefrightPlayer()
  2. :mPlayer(newAwesomePlayer){
  3. ALOGV("StagefrightPlayer");
  4. mPlayer->setListener(this);
  5. }

接口基本调用流程:

1.Java层通过JNI调用C++侧的mediaplayer相关接口

2.mediaPlayerService中创建服务器端客户端,分别实例化相关播放器,这里会把接口事件调用到具体的播放器如:本地媒体调用stagefright,流媒体调用NuPlayerDriver

3.stagefright会调用AwesomePlayer相应接口,其实流媒体侧和本地媒体类似的,最后会调用Nuplayer

媒体事件类型

[cpp] view plain copy print ?
  1. enummedia_event_type{
  2. MEDIA_NOP=0,//interfacetestmessage
  3. MEDIA_PREPARED=1,//媒体准备完毕
  4. MEDIA_PLAYBACK_COMPLETE=2,//播放事件
  5. MEDIA_BUFFERING_UPDATE=3,//Buffer更新事件,更新的值是百分比
  6. MEDIA_SEEK_COMPLETE=4,//seek事件
  7. MEDIA_SET_VIDEO_SIZE=5,//视频尺寸
  8. MEDIA_TIMED_TEXT=99,//字幕相关的,基本不用
  9. MEDIA_ERROR=100,//错误
  10. MEDIA_INFO=200,//媒体详细信息
  11. };


stagefright模块结构

stagefright模块结构图

1.mediaPlayerservice调用Stagefright相应的接口

2.Stagefright调用AwesomePlayer相应的接口

3.AwesomePlayer调用OMXCode读取ES数据,并且进行解码的处理

4.OMXCodec调用MediaSource的read函数来获取音视频的数据

5.OMXCodec调用Android的IOMX接口,其实就是Stagefrightde中的 OMX实现

6.OMX调用OMXMaster,而OMXMaster调用OMXPluginBase的接口,这里也可以获取外部的Codec的插件,最终调用对应的解码组建来完成解码,不同解码组件不太相同,后面会做介绍

7.解码完成后,通过OMXcodec返回的裸码流数据会在Awesomeplayer中调用Render模块,实现渲染,从而给用户提供了画面

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  3. Android中dispatchDraw分析
  4. Android四大基本组件介绍与生命周期
  5. Android(安卓)Service AIDL
  6. Android调用天气预报的WebService简单例子
  7. android打电话发短信
  8. android 拨打紧急号码,通话时开启免提功能实现
  9. Android调用.NET Webservice报org.ksoap2.serialization.SoapPri

随机推荐

  1. php无乱码切割中文字符
  2. 树状数据结构存储方式(CUD 篇)
  3. 超详细分析php docker的原理及作用
  4. 基于 PHP-Casbin 的 ABAC 权限控制
  5. 在 PHP 中格式化并高亮 SQL 语句
  6. QueryPHP V1-beta.5 改进 ORM 设计体验
  7. 定位分析内存泄漏的原因和后果
  8. 树状数据结构存储方式(查询篇)
  9. php重定向后跳转不了
  10. php单点登录实现原理实例详解