Android MediaCodec解码速度非常慢

Android MediaCodec解码速度非常慢,android,decode,android-mediacodec,qualcomm,Android,Decode,Android Mediacodec,Qualcomm,Android MediaCodec解码需要很长的时间,大约每帧115到118毫秒。这是h264帧。Android设备具有高通snapdragon 845处理器,因此我假设Android MediaCodec API的目标是高通GPU,而不是ARM核心CPU。 想知道是否有人曾经遇到过这样的问题,并能就如何加快解码速度提供指导 代码都是本地代码,根本没有java。没有Java,我没有活动窗口,没有表面纹理。。。所以格拉菲卡的例子在这里没有帮助。我使用的是AndroidP(9.0)API 28。N

Android MediaCodec解码需要很长的时间,大约每帧115到118毫秒。这是h264帧。Android设备具有高通snapdragon 845处理器,因此我假设Android MediaCodec API的目标是高通GPU,而不是ARM核心CPU。 想知道是否有人曾经遇到过这样的问题,并能就如何加快解码速度提供指导

代码都是本地代码,根本没有java。没有Java,我没有活动窗口,没有表面纹理。。。所以格拉菲卡的例子在这里没有帮助。我使用的是AndroidP(9.0)API 28。NDK 19.2.5x

下面是如何设置我的代码:

步骤1:我在两个单独的线程上配置了两个编解码器实例,如下所示:

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);
步骤2:我使用这些调用将编码的缓冲区排队,这些调用在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帧,但由于第3步的延迟(即115到118毫秒的延迟)而得到大约50帧:-

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