使用MediaCodec解码时dequeueOutputBuffer总是返回-1

追查到根本原因居然是因为surface的问题,具体原因不知,从日志里能找到下面这样的一句话,就说明是surface问题,这个坑搞了我几天时间


OMX_VDEC: Native window and rear native window all hided!


最终解决办法,是从activty中xml中创建surfaceview,然后获取holder,在获取surface。具体实现我让我同事实现的,我对android不熟悉


参考别人的demo,可以运行

https://blog.csdn.net/true100/article/details/53992939

视频 MediaCodec 解码流程通常分为以下几个步骤: 1. 创建 MediaCodec 对象:使用相应的解码器名称创建 MediaCodec 对象,例如 H.264 视频解码可以创建 MediaCodec 对象 `MediaCodec.createDecoderByType("video/avc")`。 2. 配置解码器:设置解码器的输入格式和输出格式,输入格式可以是容器格式(如 mp4、flv 等)或者裸流格式(如 H.264、H.265 等),输出格式可以是 Surface、ByteBuffer 等。 3. 启动解码器:调用 MediaCodec 的 start() 方法启动解码器,此解码器进入执行状态。 4. 推送数据:将需要解码的数据输入到解码器中,可以是视频流、音频流等。对于视频流,通常是将 H.264 等压缩格式的数据进行解码,得到原始的 YUV 数据。 5. 获取解码数据:调用 MediaCodecdequeueOutputBuffer() 方法获取解码后的数据,返回一个输出缓冲区的索引,通过该索引可以获取输出缓冲区中的数据。 6. 处理解码数据:根据输出缓冲区的格式,将数据转化为可显示的格式,如将 YUV 数据转化为 Bitmap 或者 Surface 中的图像。 7. 释放输出缓冲区:使用完输出缓冲区后,需要调用 MediaCodec 的 releaseOutputBuffer() 方法释放输出缓冲区。 8. 停止解码器:当解码完成或者需要停止解码,调用 MediaCodec 的 stop() 方法停止解码器。 以上是 MediaCodec 解码流程的主要步骤,具体实现需要根据不同的需求和情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值