Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼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部分)的更多相关文章
- Android Multimedia框架总结(十一)CodeC部分之AwesomePlayer到OMX服务
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52623882 前言:上篇文< ...
- Android Multimedia框架总结(二十二)MediaCodec中C++中创建到start过程及状态变换
上一章介绍MediaCodec中创建到start过程(到jni部分),从今天开始,将深入源码中看看其c++过程,看下Agenda如下: mediacodec.h CreateByType initMe ...
- Android Multimedia框架总结(七)C++中MediaPlayer的C/S架构补充及MediaService介绍
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼,文章链接: http://blog.csdn.net/hejjunlin/article/details/52465168 前面一篇主要介绍 ...
- Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构
转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52435789 前面几节中,都是通过java层调用 ...
- Android Multimedia框架总结(十五)Camera框架之Camera2补充
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52751055 前言:监于5.0之 ...
- Android Multimedia框架总结(九)Stagefright框架之数据处理及到OMXCodec过程
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼:http://blog.csdn.net/hejjunlin/article/details/52532085 不知不觉到第九篇了,感觉还有 ...
- Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...
- Android Multimedia框架总结(三)MediaPlayer中创建到setDataSource过程
转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52392430 前言:前一篇的mediaPlayer ...
- Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52349221 前言:从本篇开始,将进入Multimedia框架,包含 ...
随机推荐
- 解析spring中的BeanFactory
我们常把spring看作一个bean工厂或者ioc容器,它帮助我们负责对象的创建管理,以及对象间依赖关系的建立,还有其他的功能. 关于工厂的实现,一般来说与我们接触最多的就是BeanFactory和A ...
- countUp.js-让数字动起来
先上一段示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- c#代码输入图片
Image bgimage = Image.FromFile(flieUrl + bgImg); if (bgimage != null) { Bitmap bmp1 = new Bitmap(bgi ...
- 小白学习java设计模式之策略模式
策略模式:1.分析项目中的变化部分与不变部分(每个设计模式都要分析的)2.多用组合少用继承;用行为类组合,而不是行为继承,更具有弹性直接上代码: package com.wz.oneStrategis ...
- Mysql之触发器的操作:
触发器的操作: 1.触发器的创建: (1).创建包含一条语句的触发器 create trigger trigger_name before|after trigger_event on table_n ...
- 机器学习基石:05 Training versus Testing
train:A根据给定训练集D在H中选出g,使得Ein(g)约等于0: test:g在整个输入空间X上的表现要约等于在训练集D上的表现,使得Eout(g)约等于Ein(g). 如果|H|小,更易保证t ...
- [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- bzoj 1488: [HNOI2009]图的同构
Description 求两两互不同构的含n个点的简单图有多少种. 简单图是关联一对顶点的无向边不多于一条的不含自环的图. a图与b图被认为是同构的是指a图的顶点经过一定的重新标号以后,a图的顶点集和 ...
- 【集训第二天·翻水的老师】--ac自动机+splay树
今天是第二天集训.(其实已经是第三天了,只是昨天并没有机会来写总结,现在补上) 上午大家心情都很愉快,因为老师讲了splay树和ac自动机. 但到了下午,我们的教练竟然跑出去耍了(excuse me? ...
- java版的类似飞秋的局域网在线聊天项目
原文链接:http://www.cnblogs.com/wangleiblog/articles/5323305.html 转载请注明 最近在弄一个java版的局域网在线聊天项目,功能跟飞秋差不多.p ...