Android MediaCodec 解码耗时超长,每帧约 115 到 118 毫秒。这是一个 h264 帧。Android 设备有一个 qualcomm snapdragon 845 处理器,所以我假设 Android MediaCodec API 针对的是 qualcomm GPU 而不是 ARM 核心 CPU。想知道是否有人以前遇到过此类问题并且可以提供有关如何使此解码更快的指导?
代码都是本机代码,根本没有java。没有 Java,我没有活动窗口,没有表面纹理......所以 Grafika 示例在这里没有帮助。我正在使用 AndroidP(9.0) API 28. NDK 19.2.5x。
这是我的代码的设置方式:
Step1:我在两个单独的线程上配置了两个编解码器实例,如下所示:
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 FPS 但由于步骤 3 的延迟而得到大约 50 FPS,即 115 到 118 毫秒的延迟正在杀死我:-(
有任何想法吗?感谢任何和所有的帮助。