Android解码

转载:

 

最近整理了下Android端项目里硬解码与软解码的大致流程,做个笔记,方便以后review。如有错误,欢迎指正。
硬解码:
1.创建MediaCodec:如 MediaCodec.createDecoderByType(keyMime);
2.configure codec:配置format,surface等参数
3.start codec
4.从codec的inputBuffer缓冲区获取一个索引,用于传递解码前的数据(比如h264数据):dequeueInputBuffer,注意如果返回-1说明当前inputBuffer缓冲区已满了,不接收新的数据输入
5.如果获取的inputBufferIndex大于0,说明有可用的输入缓冲区,通过以下接口获取一个空的inputBuffer:
api 21以下:mediaCodec.getInputBuffers()[inputBufferIndex]
api 21以上:mCodec.getInputBuffers(inputBufferIndex);        
                                                                                                                                 
6.从视频容器(如MP4)demux一个数据,填充到inputBuffer,如:mExtractor.readSampleData(inputBuffer, 0);
7.现在inputBuffer已经填充了数据了,通过queueInputBuffer接口将inputBuffer送入decode队列

8.接下来调用dequeueOutputBuffer,获取解码器的输出。注意,这个函数传递以下参数:

8.接下来调用dequeueOutputBuffer,获取解码器的输出。注意,这个函数传递以下参数:

8.1 MediaCodec.BufferInfo:这个是我们作为入参传入的,传入的时候是一个空的BufferInfo。当解码器dequeueOutputBuffer获取到输出的时候,会将解码器输出数据的metadata填充到这个对象里面
     meatadata结构(bufferInfo类的定义)如下:

8.2 timeoutUs自然就是等待解码器输出的超时时间了
8.3 这个函数的返回值是:成功解码的output buffer的index,可以根据这个index获取到output buffer
9.根据outputBufferIndex,从解码器输出缓冲区中获取一个outputBuffer
api 21以下:mediaCodec.getOutputBuffers()[outputBufferIndex]
api 21以上:mCodec.getOutputBuffer(outputBufferIndex);
10.有了解码的输出数据outputBuffer和数据的metadata(包括offset,pts等信息),就得到了完整的解码数据了

 

--------------------- 
作者:学仙只为看看天 
来源:CSDN 
原文:https://blog.csdn.net/jinyongqing/article/details/80635441 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值