Android MediaCodec解码超级慢

时间:2019-05-02 01:53:19

标签: android decode mediacodec qualcomm

Android MediaCodec解码需要超长时间,每帧大约需要115到118毫秒。这是一个h264帧。 Android设备具有Qualcomm snapdragon 845处理器,因此我假设Android MediaCodec API的目标是Qualcomm GPU,而不是ARM核心CPU。 想知道是否有人曾经遇到过这样的问题,并可以提供有关如何使这种解码更快地进行指导?

代码均为本地代码,完全没有Java。没有Java,就没有活动窗口,没有表面纹理……因此Grafika示例在这里无济于事。我正在使用AndroidP(9.0)API28。NDK19.2.5x。

这是我的代码设置方式:

第一步:我在两个不同的线程上配置了两个编解码器实例,如下所示:

codecData.codec = AMediaCodec_createDecoderByType("video/avc");
AMediaFormat_setString(codecData.format_eye, AMEDIAFORMAT_KEY_MIME, "video/avc");
AMediaFormat_setInt32(codecData.format_eye, AMEDIAFORMAT_KEY_HEIGHT, 1920);
AMediaFormat_setInt32(codecData.format_eye, AMEDIAFORMAT_KEY_WIDTH, 1080);
AMediaFormat_setFloat(codecData.format_eye, AMEDIAFORMAT_KEY_FRAME_RATE, 60.0f);

Step2:我使用这些调用将编码后的缓冲区排入队列,这些调用在60 FPS输入上需要14到17毫秒,并且有两个单独的线程填充各个编解码器Q:

bufIdx = AMediaCodec_dequeueInputBuffer(codecData.codec, -1); //-1 makes it blocking call
auto buf = AMediaCodec_getInputBuffer(codecData.codec, bufIdx, &bufSize);
uint64_t presentTime = presentTimer.getTimeUs();
memcpy(buf, data, size);
AMediaCodec_queueInputBuffer(codecData.codec, bufIdx, 0, size, presentTime, 0);

第3步:我按如下步骤将解码后的缓冲区出队,在60 FPS输出上,每个编解码器每帧需要115到118毫秒。两个编解码器的出队由一个使用者线程完成,该线程一次通过两个编解码器实例:

AMediaCodecBufferInfo info_eye;
bufIdx = AMediaCodec_dequeueOutputBuffer(codecData.codec, &info_eye, 1);
auto decodedBuf = AMediaCodec_getOutputBuffer(codecData.codec, bufIdx, &bufSize);

第4步:然后将解码后的缓冲区馈送到渲染线程上的NV12toRGBA着色器,该着色器填充需要大约2毫秒的纹理。然后显示该纹理。

我期望60 FPS,但由于Step3中的延迟而获得约50 FPS,即115到118毫秒的延迟使我丧命:-(

有什么想法吗?感谢所有帮助。

0 个答案:

没有答案