音视频系列

什么是MediaCodec

MediaCodec是安卓官方提供的一套用于音视频编码和解码的API,该API是在安卓4.1(API 16)引入的,因此只能用于4.1以上的手机

MediaCodec工作原理

先上一幅图

MediaCodec工作原理.png

从图中可以看出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的使用的更多相关文章

  1. 音视频学习系列第(五)篇---MediaRecorder的使用

    音视频系列 什么是MediaRecorder MediaRecorder是安卓提供的一个用于音视频采集的类 在前几篇文章中,我们已经介绍了如何进行音频和视频的采集,即通过AudioRecord采集音频 ...

  2. 音视频学习系列第(三)篇---wav文件的存储和解析

    音视频系列 什么是wav wav是一种无损的音频文件格式,wav文件有两部分,第一部分是文件头,记录一些重要的参数信息,如音频的采样率,通道数,数据位宽,第二部分是数据部分,数据部分可以是PCM,也可 ...

  3. 实时音视频互动系列(上):又拍云UTUN网络详解

    如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...

  4. 实时音视频互动系列(下):基于 WebRTC 技术的实战解析

    在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...

  5. Intelli IDEA学习系列之快捷键篇

    Intelli IDEA学习系列之快捷键篇 IDEA简介: IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能 ...

  6. Python学习系列(七)( 数据库编程)

    Python学习系列(七)( 数据库编程)        Python学习系列(六)(模块) 一,MySQL-Python插件       Python里操作MySQL数据库,需要Python下安装访 ...

  7. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

  8. Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向

    最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...

  9. Android IOS WebRTC 音视频开发总结(七四)-- WebRTC开源5周年了,Google怎么看?

    本文最早发表在我们的微信公众号上(微信ID:blackerteam),支持原创,详见这里, 2016年6月9日是WebRTC开源5周年的日子,Google WebRTC负责人Harald在社区里面写了 ...

随机推荐

  1. Winter Storm Warning

    2019-01-02 11:22:33 ...WINTER STORM WARNING REMAINS IN EFFECT UNTIL 6 AM AKST TUESDAY... * WHAT...He ...

  2. SQL Server 2008 R2 超详细安装图文教程

    一.下载SQL Server 2008 R2安装文件 ed2k://|file|cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso ...

  3. 消息 8101,级别 16,状态 1,第 1 行 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'ResourceInfo'中的标识列指定显式值。

    问题分析: 意思是你的主键是自动编号类型的,所以不能向该列插入数据. 解决办法: 执行 语句 :SET IDENTITY_INSERT CUSTOMER_TBL ON 然后在向表中插入数据,如inse ...

  4. winfrom 下 listbox 选项添加value

    public struct MyItem { public string Name; public string Tag; public override string ToString() { re ...

  5. font-awesome图标

  6. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  7. 【转】五分钟读懂大数据核心MapReduce架构及原理

    什么是MapReduce Hadoop中的MapReduce是一个简单的软件框架,基于它写出的应用程序可以运行在由上千个商用机器组成的大型集群上,并以一种可靠容错式并行处理TB级数据 MapReduc ...

  8. java多线程----JUC集合”01之 框架

    java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要有: LinkedList, A ...

  9. CSS3实现8种Loading效果【二】

    CSS3实现8种Loading效果[二]   今晚吃完饭回宿舍又捣鼓了另外几种Loading效果,老规矩,直接“上菜“…… 注:gif图片动画有些卡顿,非实际效果! 第一种效果: 代码如下: < ...

  10. LabVIEW如何方便地调用DLL文件

    转自:http://bbs.elecfans.com/jishu_469502_1_1.html   LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...