Android MediaCodec简单总结

article/2025/10/6 20:25:26
#.MedaiCodec简介
MediaCodec是Android中提供的音视频编码、解码工具。它主要是完成上层接口的封装,提供给开发者使用,编解码功能实际是在native底层服务中完成的。
#.MediaCodec工作的宏观流程:
##.包换两个缓冲区队列
一个输入缓冲区队列,包含一组输入缓冲区(格式ByteBuffer);
一个输出缓冲区队列,包含一组输出缓冲区(格式ByteBuffer);
##.使用中,需要不断重复以下过程
1.把原始数据放入输入缓冲区队列中一个空缓冲区上;
2.编/解码器从输入缓冲队列中获取缓冲区上数据,进行编码处理,结果存放到输出缓冲区上一个空缓冲区上,
处理完毕后,释放该输入缓冲区,它会被重新放回输入缓冲区队列,以便下次重复使用;
3.对输出缓冲区上数据做自己需要的业务处理处理,处理完毕后,释放该输出缓冲区,
它会被重新放回输出缓冲区队列,以便下次重复使用。
##.当对视频帧进行编/解码时,一般会用编码器创建一个输入Surface或为编码器设置一个输出Surface,在这里Surface充当着数据缓冲区的角色。
使用Surface可以提高编/解码器的性能,Surface直接使用native视频数据缓存,没有映射或复制它们到ByteBuffers,这种方式会更加高效。
#.内部的状态机和处理流程
##.状态机,三类状态:
1.停止态(Stopped):
1.1 未初始化状态(Uninitialized)
1.2 配置状态(Configured)
1.3 错误状态(Error)
2.执行态(Executing):
2.1 刷新状态(Flushed)
2.2 运行状态( Running)
2.3 流结束状态(End-of-Stream)
3.释放态(Released)
##.操作流程:
1.一般流程为创建编/解码器,此时处于未初始化状态(Uninitialized);
2.调用configure(…)方法对编解码器进行配置,使编解码器转入配置状态(Configured);
3.调用start()方法,使其转入执行刷新状态(Flushed);
4.此时编解码器已经拥有其输入/输出缓存,当第一个输入缓存区被移出队列,编解码器转入运行状态( Running);
5.在运行状态( Running)中,编解码器不断对输入缓冲区中数据做编解码操作,结果存到输出缓冲区;
6.当一个带有end-of-stream标记的输入缓存入队列时,编解码器将转入流结束状态(End-of-Stream)。
在这种状态下,编解码器不再接收新的输入缓存,但它仍然产生输出缓存。直到
7.当输入缓存中所有数据都被处理完,带有end-of-stream标记的数据帧到达输出缓存后,转入释放态(Released)。
当我们处理完输出数据后,在此状态下可以用release()进行相关资源的释放。
##.状态转化其它相关要点:
1.在执行状态(Executing)下的任何时候,通过调用flush()方法使编解码器重新返回到刷新子状态(Flushed);
2.通过调用stop()方法使编解码器返回到未初始化状态(Uninitialized),此时这个编解码器可以再次重新配置;
3.编解码器遇到错误时会进入错误状态(Error),此时应调用reset()方法使编解码器再次可用。
4.任何状态下调用reset()方法使编解码器返回到未初始化状态(Uninitialized)
##.MediaCodec相关API介绍:
createDecoderByType:获取解码器对象
createEncoderBytype:获取编码器对象
configure:对编解码器进行配置,使编解码器转入配置状态
start:使编码器转入执行刷新状态
stop:结束并返回到未初始化状态
release:释放实例资源
createInputSurface:创建输入缓冲Surface
setOutputSurface:设置输出缓冲Surface
getInputBuffers:获取需要编码数据的输入流队列,返回的是一个ByteBuffer数组
queueInputBuffer:输入流入队列
dequeueInputBuffer:从输入流队列中取数据进行编码操作
getOutputBuffers:获取编解码之后的数据输出流队列,返回的是一个ByteBuffer数组
dequeueOutputBuffer:从输出队列中取出编码操作之后的数据
releaseOutputBuffer:处理完成,释放ByteBuffer数据
##.MediaCodec的两种工作方式
1.同步方式:数据输入和数据输出依次进行。
要等待上一次数据输入后,才能数据输出;
等待上一次数据输出后,才能再次进行数据输入。
2.异步方式:数据输入和数据输出操作顺序相互独立。
是底层服务来判断何时输入/输出可以进行,然后进行相应回调,
开发者在回调中进行数据输入/输出处理。
//异步处理方式时,需要设置回调接口。
//在回调中进行数据处理
mEncoder.setCallback(new MediaCodec.Callback() {//有可用的输入缓冲区时回调@Overridepublic void onInputBufferAvailable(@NonNull MediaCodec codec, int index) {}//有可用的输出缓冲区时回调@Overridepublic void onOutputBufferAvailable(@NonNull MediaCodec codec, int index, @NonNull MediaCodec.BufferInfo info) {}//输出格式变化时回调@Overridepublic void onOutputFormatChanged(@NonNull MediaCodec codec, @NonNull MediaFormat format) {}//出错时回调@Overridepublic void onError(@NonNull MediaCodec codec, @NonNull MediaCodec.CodecException e) {}
});

http://chatgpt.dhexx.cn/article/MjsIqPaB.shtml

相关文章

软件测试面试指导之自我介绍

面试自我介绍虽然人人都准备,但是做到让人印象深刻可不容易啊。 本篇就具体来聊聊人人都要经历的面试,怎么做自我介绍,才能让你在面试官的眼睛里像金子一样闪闪发光? 面试是什么? 它是个机会,让面试官更…

软件测试面试要注意的细节以及处理(自我介绍篇)

面试问题第一问,95%都会是: 请简单的做个自我介绍吧~ 分以下几点说明。 一、个人的基本信息,扬长避短 1、年纪太大与太小,都不需要主动去说明。 比如我年纪只有21岁 例子:面试官您好,我叫***&#xff…

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、自我介绍 您好…

软件测试面试怎样介绍自己的项目?会问到什么程度?

最近收到很多粉丝的私信说找不到工作,简历投了百十来份,邀约都没几个,更别说offer了,是不是软件测试要黄了? 说句实话,现在大环境确实不好,互联网大厂裁员这是摆在明面上的原因。时代的一粒沙&…

软件测试面试怎样介绍自己的测试项目?会问到什么程度?

想知道面试时该怎样介绍测试项目?会问到什么程度?那就需要换位思考,思考HR在这个环节想知道什么。 HR在该环节普遍想获得的情报主要是下面这2个方面: 1)应聘者的具体经验和技术能力, 2)应聘者的…

【软件测试】面试中介绍项目你该这么说!

黑马程序员视频库 播妞微信号:heiniu526 传智播客旗下互联网资讯、学习资源免费分享平台 测试人员在找工作的过程中,通常有一个问题是很难绕开的。就是要如何向别人介绍自己之前做过的项目。下面我们就这个问题简单的做一些分析。 大体上可以分为如下几个…

软件测试面试自我介绍/项目介绍居然还有模板?我要是早点发现就好了

目录 1、自我介绍 2、项目介绍 2.1、最全电商项目介绍 2.2、电商项目介绍 2.3、在线教育项目介绍 2.4、互联网金融项目介绍 总结 1、自我介绍 以XXX简历来举例(参照下面的案例,编写你的自我介绍,框架就是:我是谁&#xff0…

软件测试面试,如何自我介绍?如何介绍项目?如何介绍个人技术?(提供面试话术)

前准备不足而导致面试失败那可就亏大了!为了提高面试成功率,帮助大家尽快拿到高薪offer,我们盘点了面试环节必问的三类问题,希望对即将参加软件测试面试的小伙伴们有所帮助。 01 如何自我介绍 面试过程中一定要放慢语速&#xf…

软件测试面试,如何自我介绍?

01 如何自我介绍 面试过程中一定要放慢语速,做到条理清晰。特别是做自我介绍时,可以适当多介绍自己会什么,有哪些重要经验。 例如: 面试官,上午/下午好。 我是XXX,今天来面试贵公司的软件测试工程师岗位&a…

软件测试工程师面试如何做好自我介绍?

听了很多提问者和我的学生,在做自我自我介绍的时候,一般存在的问题: 1、表述不太流畅。多练习表述,自己录音,听回放,有问题改正。 2、表述太溜,语速太快。不自信表现,隐含紧张的情绪…

软件测试三分钟自我介绍

目录 一、个人的基本信息,扬长避短 二、突出自己的工作经验 三、突出自己的技能 四、个人兴趣爱好与结尾 自我介绍在面试中常常作为第一个问题而出现,好的自我介绍可以带来良好的第一印象,如何讲好自我介绍呢。我建议从三部分下手 一、个…

软件测试面试指导之自我介绍 (干货)

面试自我介绍虽然人人都准备,但是做到让人印象深刻可不容易啊。 本篇就具体来聊聊人人都要经历的面试,怎么做自我介绍,才能让你在面试官的眼睛里像金子一样闪闪发光? 面试是什么? 它是个机会,让面试官更…

软件测试面试必考题:自我介绍

面试问题第一问,95%都会是: 请简单的做个自我介绍吧~ 分以下几点说明。 一、个人的基本信息,扬长避短 1、年纪太大与太小,都不需要主动去说明。 比如我年纪只有21岁 例子:面试官您好,我叫***&#xff0…

软件测试工程师自我介绍(范本)

一、先介绍自己的基本信息,要注意扬长避短 1、年纪太大与太小,就不要主动去说明。 比如你的年纪只有20岁 例子:我叫***,从事软件测试工作有几年了。 2、不是计算机相关专业毕业的也不要过多的去提 比如你的专业是机械专业 例…

软件测试面试01:自我介绍

2.1 简单的自我介绍下 面试宫,您好,我叫XXX,来自于XXXX,目前从事软件测试工作,已经三年工作经验,个人性格,比较开朗,跟人关系比较好,做事也比较细心三年测试工作经验中&…

IntelliJ IDEA 打jar包后,运行没有反应

问题现象: 双击没有反应,CMD下运行java -jar xxx.jar 后提示:xxx.jar中没有主清单属性 问题分析: 1.可能是没有maven插件 spring-boot-maven-plugin。 2. 没有指定入口(main方法),或者指定错误。 解决方法&#xf…

IDEA中如何导入jar包

IDEA中如何导入jar包,有两种方法。 此处的Directory eclipse中的folder 方法一: 方法二:

idea手动导入jar包并配置

标题:idea手动导入jar包并配置 1.右击项目,直接新建文件夹lib,然后将需要导入的jar,粘贴到lib中。2.file > project Structure > libraries > > java, 然后找到该项目所在的lib的我们粘贴进去的jar,点击…

IDEA中导入jar包失败如何解决

Project Structure 中的Libraries中出现报错。下面给出我的一点建议,希望可以帮助大家! 首先点击左上角的+,点击java 接着它会导入你目录中的某个位置,选中ok。 然后我将我已有的都导入进去了,按住Ctrl&…

Mac IDEA中导入jar包

Mac IDEA中导入jar包 Source Distribution vs Binary Distribution导入下载好的jar包1. 在IDEA中打开File,选择Project Structure (或者使用快捷键: Command ;)2.选中Modules,并在Dependencies中添加JARs or Directories包&#…