首先MediaCodec的原理,网上一搜一大堆;
不过我认为,它就是一个数据从输入,处理,到输出的包装;也就是它使用时,三大块
1、输入处理
2、输出处理
3、中间编解码过程(这个是MediaCodec的功能)
1、使用
创建编/解码,三步
a、MediaCodec静态方法创建编码器(标志为1)或者解码器(标志为0)
b、使用configure方法配置:
MediaFormat配置自己研究
surface只有在输出时有用,输入的情况使用createInputSurface()创建去关联
c、调用start方法启动,这时,输入,编解码,输出已经开始运作
调用setCallback方法可以异步处理
创建启用同步处理
好吧,我刚开始学习的时候使用同步,后续都改成异步了,好在github上有记录
首先向mediacodec放入数据
dequeueInputBuffer方法返回值大于-1时,表示输入可用
getInputBuffer:获取输入buffer,数据放入这个里面
queueInputBuffer:通知中间处理过程,去处理数据
然后取出数据,(注意:放入一次数据,取出时数据次数不定),需要多次取,直到这次放入的数据没有没有对应的输出
dequeueOutputBuffer:结果大于-1时,表示有输出数据
getOutputBuffer:输出buffer,数据在这里面,dequeueOutputBuffer这里面参数info是buffer中的数据信息
releaseOutputBuffer:释放buffer
同步使用示例其中:AudioMgr.mgr.addADTStoPacket(desByte, 7 + info.size)这是裸流aac时需要加入格式头
异步使用简单,但要注意同步问题
主要有四个方法,输入可用,输出可用,输出format变化,和出现错误
因此,在这些中不可以调用检测输入,输出是否可用的方法
输入时,直接取输入buffer,放入数据,通知编解码
输出时,直接取输出buffer,取出数据,释放输出buffer
异步调用示例
网友评论