音视频学习系列第(七)篇---MediaCodec的使用
什么是MediaCodec
MediaCodec是安卓官方提供的一套用于音视频编码和解码的API,该API是在安卓4.1(API 16)引入的,因此只能用于4.1以上的手机
MediaCodec工作原理
先上一幅图

从图中可以看出MediaCodec的架构采用了2个缓冲区队列,即input缓冲区队列和output缓冲区队列
缓冲区队列
它是一个队列,队列中的每个元素都是一个换种区
Client,Codec
Client指的是API的使用者
Codec指的是数据的处理者(编码或解码)
详细流程
1.Client从Codec拿到input缓冲区队列[getInputBuffers]
2.Client从input队列中申请一个empty buffer[dequeueInputBuffer]
3.Client将需要编解码的数据拷贝到empty buffer,然后将其放入input队列[queueInputBuffer]
4.Codec从input缓冲区取出一个buffer(一帧)数据,对其进行编解码处理
5.编解码处理结束后,Codec将原始数据的buffer置为empty后放入input缓冲区队列,并将编解码后的数据放到output缓冲区队列
6.Client从Codec拿到output缓冲区队列[getOutputBuffers]
7.Client从output队列申请一个有编解码数据的buffer[dequeueOutputBuffer]
8.Client对编解码的数据进行渲染/播放
9.渲染/播放完成后,Client再将这个buffer放回output缓冲区队列[releaseOutputBuffer]
注意
虽然我标注了1到9,但两个Client和Codec模块是并行工作的,MediCodec在架构上采用的是一种基于环形缓冲区的生产者-消费者设计模式
在input端,Client就是这个环形缓冲区的生产者,Codec是消费者
在output端,Codec是这个环形缓冲区的生产者,Client是消费者
MediaCodec的使用流程
1.创建编/解码器
mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
mMediaCodec = MediaCodec.createDecoderByType(MIME_TYPE);
2.设置参数
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
setInteger(String name, int value)
mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.configure(format, null, null, 0);
3.开启编解码
mMediaCodec.start();
4.通过2个缓冲区队列进行数据的处理(编解码)
while(1) {
- dequeueInputBuffer
- queueInputBuffer
- dequeueOutputBuffer
- releaseOutputBuffer
}
5.释放资源
mMediaCodec.stop();
mMediaCodec.release();
mMediaCodec = null;
MediaCodec的缺陷
1.API的限制
要去API>=16,有的甚至更高,不能很好的兼容低版本手机
2.安卓机型适配问题
每个安卓厂商都对系统底层(Native层)做了一些自己的修改,而MediaCodec的真正实现在Native层,因此不可避免的会出现在这个手机可以运行,在另外一个手机崩溃的问题
3.出现问题难以定位
前面说了,MediaCodec的真正实现在Native层,而这个Native层的代码是嵌在手机中的,我们不能对其进行调试
不仅仅是MediaCodec这个API,多媒体相关的很多API都是这样,如MediaMuxer,在小米5 6.0.1中报如下错误
WVMExtractor: Failed to open libwvm.so: dlopen failed: library "libwvm.so" not found
猜测可能是手机缺少libwvm这个动态库
鉴于这些问题,我觉得还是学习一些第三方的开源库,所有的过程都经过我们可调试的代码,将主动权窝在自己手中
完整代码
鉴于我的代码在我的手机还没跑通,等我将问题解决之后,在更新一下
参考链接
https://www.jianshu.com/p/e6c683d6dbbe
https://blog.csdn.net/angcyo/article/details/51043367
https://blog.csdn.net/guojin08/article/details/27555473
音视频学习系列第(七)篇---MediaCodec的使用的更多相关文章
- 音视频学习系列第(五)篇---MediaRecorder的使用
音视频系列 什么是MediaRecorder MediaRecorder是安卓提供的一个用于音视频采集的类 在前几篇文章中,我们已经介绍了如何进行音频和视频的采集,即通过AudioRecord采集音频 ...
- 音视频学习系列第(三)篇---wav文件的存储和解析
音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...
- 实时音视频互动系列(上):又拍云UTUN网络详解
如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...
- Intelli IDEA学习系列之快捷键篇
Intelli IDEA学习系列之快捷键篇 IDEA简介: IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能 ...
- Python学习系列(七)( 数据库编程)
Python学习系列(七)( 数据库编程) Python学习系列(六)(模块) 一,MySQL-Python插件 Python里操作MySQL数据库,需要Python下安装访 ...
- 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
[Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...
- Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向
最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...
- Android IOS WebRTC 音视频开发总结(七四)-- WebRTC开源5周年了,Google怎么看?
本文最早发表在我们的微信公众号上(微信ID:blackerteam),支持原创,详见这里, 2016年6月9日是WebRTC开源5周年的日子,Google WebRTC负责人Harald在社区里面写了 ...
随机推荐
- unity3d-编辑器结构
1.Porject视图 Project视图主要存放游戏中用到的所有资源文件,常见的资源包括: 游戏脚本.预设.材质.动画.自定义字体.纹理.物理材质和GUI皮肤.这些资源需要 赋予Hierarchy视 ...
- 第三章基本的SQl查询语言
---恢复内容开始--- ---恢复内容结束---
- photoshop打造超酷炫火焰人像效果
效果图看上去非常的酷.制作方法跟火焰字过程差不多.唯一不同的是前期的处理,需要用滤镜把人物轮廓路径找出来,去色后再用制作火焰的过程制作.最后把最好的火焰叠加到人物上面,适当用蒙版控制区域即可.原图 最 ...
- Twitter OA prepare: Rational Sum
In mathematics, a rational number is any number that can be expressed in the form of a fraction p/q ...
- 012-centos6.5配置静态ip
文件名为:ifcfg-eno16777736 DEVICE=eno16777736TYPE=EthernetONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPAD ...
- html5新元素练习(1)
1, <nav> 是专门由于菜单导航,链接导航的元素 2, <header> 主体页面的头部,与head不同,它的内容可以显示出来 3, <footer>页面 ...
- Eclipse 启动项目错误:class not found
其中,很可能的原因:项目存在编译错误,根本没有编译成功,没有生成class文件:可查看problems标签页查看具体错误.
- Shell脚本实现检测某ip网络畅通情况,实战用例
Shell脚本实现检测某ip网络畅通情况,实战用例 环境准备,linux shell 发送email 邮件:1.安装sendmailyum -y install sendmail安装好sendmail ...
- HTML5 -canvas拖拽、移动 绘制图片可操作移动,拖动
关于canvas 的基础知识就不多说了,可以进这个网址学习 http://www.w3school.com.cn/html5/html_5_canvas.asp 对于canvas 和 SVG 其实一开 ...
- 20145122《Java程序设计》第七周学习总结
教材学习内容总结 1.在只有Lambda表达式的情况下,参数的类型必须写出来. 2.Lambda表达式本身是中性的,同样的Lambda表达式可用来表示不同目标类型的对象操作. 3.Lambda表达式只 ...