转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53386117

我最近正在参加CSDN 2016年度博客之星评选,来来来,开车咯,赶紧帮投票吧! 时间:11月28日到12月18日每天都可以为我投一票 投票地址:http://blog.csdn.net/vote/candidate.html?username=hejjunlin

上一章介绍MediaCodec的说明及状态图,从今天开始,将深入源码中看看其过程,看下Agenda如下:

  • 一张图看清MediaCodec从创建到start过程
  • 补充MediaCodec基本用法
  • MediaCodec中BufferInfo内部类:
  • android_media_MediaCodec.cpp
  • android_media_MediaCodec.h

一张图看清MediaCodec从创建到start过程(到jni部分)

补充MediaCodec基本用法

MediaCodec的使用遵循一个基本模式:

  • 1.创建和配置MediaCodec对象
  • 2.进行以下循环:

    • 如果一个输入缓冲区准备好:
    • 读取部分数据,复制到缓冲区
    • 如果一个输出缓冲区准备好:
    • 复制到缓冲区
  • 3.销毁MediaCodec对象

一个MediaCodec对象可以对特定类型的数据(MP3音频或H.264视频)进行编码或解码。因为是在原始数据上操作,所以任何文件头(比如ID3 tags)必须被剔除,MediaCodec不与任何更高层次的内容交互,所以无法通过扬声器播放音频或者从网络接收视频流。它只将缓冲区数据读入,再输出到缓冲区。MediaCodec可以把大部分的外层数据去掉。

有些编解码器对Buffer非常挑剔。比如,Buffer必须满足特定的内存对其方式,或者某个最值尺寸,或者同时满足几点。为了更强的兼容性,编解码器从应用程序获取分配Buffer的权限。所以,不是装有数据的Buffer直接给MediaCodec,而是想MediaCodec请求一个Buffer,再把数据拷进去。

这样好像和“zero-copy”原则相违背,但其实在大多数情况下并不需要拷贝,因为编译码器并不是非得拷贝或调整数据来满足要求(What?)。在某些情况下,你可以直接使用那个Buffer,比如直接从硬盘或网络读取数据到Buffer,所以拷贝不是必须的(这不就是拷贝吗?)

MediaCodec的输入必须处理成特定的格式。H264视频编码的时候输入就是一帧数据,H264解码指的就是一个NAL单元。但你不可能一次只提交单个数据或数据在需要处理的时候才出现(待商榷),这样看起来,输入更像是一个流。实际上,编解码器在输出前同时拥有多个Buffer。

MediaCodec中BufferInfo内部类:

本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53386117

MediaCodec和MediaPlayer在很多地方有相似之处,当java层调用MediaCodec.createByCodecName,MediaCodec.createDecoderByType,MediaCodec.createEncoderByType都会到达MediaCodec的构造,构造中都会调用native_setup,如下:

其中对应到有这么一段,相当于是作了一次映射

接着进入android_media_MediaCodec_native_setup函数

setMediaCodec函数如下:

接下来看下JMediaCodec的构造

以上几个步骤到得到MediaCodec对像后,就到达Java层调用MediaCodec.configure(format,surface,null,0)

通过获取format中map,就是一个hashmap,便利视频源的格式放到两个数组中,然后,再通过native_configure向下传递


本文出自逆流的鱼yuiop:
http://blog.csdn.net/hejjunlin/article/details/53386117

当调用start后,public native final void start();

JMediaCodec中start

最后看下对应jni的android_media_MediaCodec.h如下:




第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)相关推荐

  1. Android基础知识(二十一):Android五大存储之文件存储、Content Provider存储和网络存储

    Android基础知识(二十一):Android五大存储之文件存储.Content Provider存储和网络存储 一.Android存储--持久化技术 数据持久化是指将那些内存中的瞬时数据保存到存储 ...

  2. Android产品研发(二十一)--Android中的UI优化

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代 ...

  3. Android多媒体框架(3)—— libstagefright中MediaCodec源码分析

    libstagefright中MediaCodec源码分析 和前两篇一样,我们按照MediaCodec的各个状态来分析libstagefright中MediaCodec的源代码. configure ...

  4. Android流行框架(二)

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  5. Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报

    上一篇:Android 天气APP(二十)增加欢迎页及白屏黑屏处理.展示世界国家/地区的城市数据 前言   写APP是有很多细节需要处理的,这些细节可以提高你的APP的使用概率.这已经是第二十一篇文章 ...

  6. Android MultiMedia框架完全解析 - 概览

    之前的工作中,一直在看Android MultiMedia的一些东西,关注我博客的同学也许知道我换工作了,以后将要从事Camera相关的工作,于是乎,将之前整理存放在有道云笔记里面的一些东西发出来,整 ...

  7. Android音频框架之二 用户录音启动流程源码走读

    前言 此篇是对<Android音频框架之一 详解audioPolicy流程及HAL驱动加载>的延续,此系列博文是记录在Android7.1系统即以后版本实现 内录音功能. 当用户使用 Au ...

  8. 8. Android MultiMedia框架完全解析 - prepareAsync的过程分析

    还是从mediaplayer.cpp文件开始分析: status_t MediaPlayer::prepareAsync() {ALOGV("prepareAsync");Mute ...

  9. [unreal4入门系列之十二] 在UE4中创建非玩家角色(NPC)

    现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 创建C++类 1) 在UE编辑器中,打开文件-新建C+ ...

  10. android file isdirectory,android – 为什么我不能在Environment.DIRECTORY_PICTURES中创建一个目录?...

    这是我的代码 File selfieLocation = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES),"Dail ...

最新文章

  1. 指针运算(自己做个笔记)
  2. list indices must be integers or slices, not tuple
  3. 数据驱动才是零售企业转型的核心!
  4. hbase shelljava 获取多版本的值
  5. android shape 按钮背景_Android button, xml文件定义形状,代码中修改背景颜色
  6. 学生时代的神操作,你了解吗?
  7. 有道翻译-python
  8. 简书留言频率限制机制
  9. 简记SqueezeNet
  10. 使用 jQuery 和 KnockoutJS 开发在线股票走势图应用
  11. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (3)
  12. vue商城秒杀倒计时功能
  13. 如何搜索英文文献综述?
  14. Android-Material-Sloth
  15. IBM建立大中华区云计算中心供验证测试
  16. 第四周项目3---单链表的应用之连接
  17. AD7606调试过程与源码
  18. 百度 android 市场,百度Q2报告:Android市场份额21.4% 同比增长890%
  19. Spring框架-AOP
  20. jQuery源码分析之$.ajax方法

热门文章

  1. 主干网络系列(1) -ResNet: Deep Residual Learning for Image Recognition
  2. 软件工程过程 - 期末复习
  3. Spring Web MVC(二)
  4. 使用其它模块的头文件
  5. Request的getParameter和getAttribute方法的区别
  6. 《实时控制软件设计》团队项目第三天工作日志
  7. x264编码详细文字全过程
  8. 云计算时代的数据库研究
  9. 讲座资源:ASP.NET AJAX 体验
  10. 智能优化算法:鸟群算法-附代码