Android 硬解码 MediaCodec 遇到的(部分手机绿屏)API21

MediaCodec 是android用来做音视频编解码

下面是遇到其它的问题(解码几分钟后一直dequeueInputBuffer-1

http://blog.csdn.net/qq377366355/article/details/79082894

注意:由于时间有限我这里就不说用法了,只说一些我遇到的上些问题及理解。

老铁们可以多baidu,这里是一个老铁的中文说明,MediaCodec 中文API文档

目前网上的例子大部分是Synchronous Processing using Buffer Arrays (deprecated)这种方式写的demo,<=20 API可以用。

现在5.0以下的手机已经很少了,并且我的应用要求延时小,所以就只支持5.0或以上的手机。

这里网上基本有二个方式,推荐第一种

下面是我用的代码,

    public boolean onFrame(byte[] buf, int offset, int length) { 

//这里while是为了保证每一帧数据能够送入解码,我之前就用的下面的方式,有时候出现好几帧没有送入解码,

     //便出现花屏,部分手机绿屏(华为,honor手机),   

//这部分是送入解码

//因为相关参数我也不是很明白,所以就不多说了,以免引起误解决。

while(true){
       inputBufferId = mCodec.dequeueInputBuffer(20000);       
       if (inputBufferId >= 0) {
           inputBuffer = mCodec.getInputBuffer(inputBufferId);
           inputBuffer.clear();
           inputBuffer.put(buf, offset, length);
           mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
                   * TIME_INTERNAL, 0);
           mCount++;
       } else{
        continue;
       }
            

               //这部分是解码后的处理, dequeueOutputBuffer延时20000是跟据测试来写的,这个好像是看手机硬解的能力,所以要自己测试调整

      //如果延时太小了,可能出现解码延时,该帧不会显示。
       outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, 20000);
       if (outputBufferId >= 0){
           mCodec.releaseOutputBuffer(outputBufferId, true);       
           return true;
       } else if (outputBufferId == -1){
           Log.e("H264", "AMEDIACODEC__INFO_TRY_AGAIN_LATER");

           return false;
       }else if (outputBufferId < 0){
           return false;
       }  
    }
    return true;
    }

     网上的另一种方式

inputBufferId = mCodec.dequeueInputBuffer(timeoutUs);       
        if (inputBufferId >= 0) {
            inputBuffer = mCodec.getInputBuffer(inputBufferId);
            inputBuffer.clear();
            inputBuffer.put(buf, offset, length);
            mCodec.queueInputBuffer(inputBufferId, 0, length, mCount
                    * TIME_INTERNAL, 0);
            mCount++;
        }
       outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
       while (outputBufferId >= 0) {
       mCodec.releaseOutputBuffer(outputBufferId, true);
            outputBufferId = mCodec.dequeueOutputBuffer(bufferInfo, timeoutUs);
        } 

       

     http://download.csdn.net/download/qq377366355/10126982

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值