音视频系列

什么是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.创建编/解码器

  1. mMediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
  2. mMediaCodec = MediaCodec.createDecoderByType(MIME_TYPE);

2.设置参数

  1. MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight);
  2. setInteger(String name, int value)
  3. mMediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
  4. mMediaCodec.configure(format, null, null, 0);

3.开启编解码

  1. mMediaCodec.start();

4.通过2个缓冲区队列进行数据的处理(编解码)

  1. while(1) {
  2. - dequeueInputBuffer
  3. - queueInputBuffer
  4. - dequeueOutputBuffer
  5. - releaseOutputBuffer
  6. }

5.释放资源

  1. mMediaCodec.stop();
  2. mMediaCodec.release();
  3. mMediaCodec = null;

MediaCodec的缺陷

1.API的限制
要去API>=16,有的甚至更高,不能很好的兼容低版本手机

2.安卓机型适配问题
每个安卓厂商都对系统底层(Native层)做了一些自己的修改,而MediaCodec的真正实现在Native层,因此不可避免的会出现在这个手机可以运行,在另外一个手机崩溃的问题

3.出现问题难以定位
前面说了,MediaCodec的真正实现在Native层,而这个Native层的代码是嵌在手机中的,我们不能对其进行调试
不仅仅是MediaCodec这个API,多媒体相关的很多API都是这样,如MediaMuxer,在小米5 6.0.1中报如下错误

  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. type Props={};

    Components Learn how to type React class components and stateless functional components with Flow Se ...

  2. chkconfig添加进入服务后,出现的现象

    比如在php-fpm添加服务中,一部分脚步如下 #!/bin/sh       #       # php-fpm - this script starts and stops the php-fpm ...

  3. vue框架(二)_vue环境搭建及创建项目

    1.node.js:概念介绍及安装 node.js:是一个基于chrome浏览器的v8引擎,可以运行javascript的环境(平台) 特性:异步IO模型 npm:是一个包管理器(工具),可以按装依赖 ...

  4. Intro to Python for Data Science Learning 4 - Methods

    Methods From:https://campus.datacamp.com/courses/intro-to-python-for-data-science/chapter-3-function ...

  5. mybatis打印sql日志配置

    <settings> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGI ...

  6. Java应用开发的一条重要经验:先建立基础设施

    一旦为应用建立良好的基础设施, 后续的开发就会变得容易而快速.这些基础设施包括: 1.    线程池的建立与配置: 在 JDK 并发库的基础上建立适合于应用的多任务接口和框架: 2.   外部系统服务 ...

  7. HTML5代码规范

    HTML5代码规范html标签里面等号两边不要留空格在IE下可能会识别不了html5等号前后可以使用空格,但仍不推荐使用. HTML 代码约定很多 Web 开发人员对 HTML 的代码规范知之甚少.在 ...

  8. redis 哨兵机制环境搭建

    Redis哨兵机制,一主二从 注:Redis哨兵切换,建议一主多从 一.一主二从 教程步骤:https://www.cnblogs.com/zwcry/p/9046207.html 二.哨兵配置(se ...

  9. Windows下使用MakeFile(Mingw)文件

    下面是我基于<C++GUI QT4编程(第二版)> 2.3节快速设计对话框编写例子地址: https://files.cnblogs.com/files/senior-engineer/g ...

  10. DBMS_OUTPUT.PUT_LINE()方法的简单介绍

    1.最基本的DBMS_OUTPUT.PUT_LINE()方法. 随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就 ...