Я вручную читаю поток RTP/H264 и передаю кадры H264 на Android MediaCodec. Я использую «markerBit» в качестве рамки для фреймов. MediaCodec привязан к текстуре OpenGL (SurfaceTexture). В целом все работает нормально. Но декодер выглядит как буферный кадр. Если я поместил фрейм в декодер, он сразу не отображается текстуре. После того, как я поместил в декодер 2-3 кадра больше, первый кадр отображается текстуре.Android MediaCodec появляется для хранения кадров H264
Я реализую Android 4.4.4.
private static final int INFINITE_TIMEOUT = -1;
private static final int TIMEOUT_OUTPUT_BUFFER_MEDIA_CODEC = 1000;
...
int bufferIndex = codec.dequeueInputBuffer(INFINITE_TIMEOUT);
if (bufferIndex < 0) {
throw new RuntimeException("Error");
}
ByteBuffer inputBuffer = inputBuffers[bufferIndex];
inputBuffer.clear();
// Copy H264 data to inputBuffer
h264Frame.fill(inputBuffer);
codec.queueInputBuffer(bufferIndex, 0, inputBuffer.position(), 0, 0);
drainOutputBuffers();
...
и
private boolean drainOutputBuffers() {
MediaCodec.BufferInfo buffInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(buffInfo, TIMEOUT_OUTPUT_BUFFER_MEDIA_CODEC);
if (outputBufferIndex >= 0) {
codec.releaseOutputBuffer(outputBufferIndex, true);
return true;
}
switch (outputBufferIndex) {
case MediaCodec.INFO_TRY_AGAIN_LATER:
LOG.debug("Could not dequeue output buffer. Try again later");
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
LOG.warn("The output format has changed.");
break;
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
LOG.warn("The output buffers has changed.");
break;
default:
LOG.warn("The output buffer index was negative: {}", outputBufferIndex);
}
return false;
}
На стороне рендеринга я использую «onFrameAvailable» обратный вызов для проверки, если я должен обновить текстуру на OPENGL тему. Флаг, который я использую для проверки, защищен блокировкой (синхронизирован).
Я подозреваю, что временная метка презентации может повлиять на рендеринг. Но я установил его равным 0. Таким образом, я предполагаю, что кадр должен отображаться без задержки.
Я хотел бы, чтобы рамка была обработана текстурой без необходимости добавления дополнительных кадров.
Я не думаю, что это характер декодера h264, это, скорее всего, недостаток в MediaCodec. Если я делаю это на ПК с помощью ffmpeg, задержки нет. – user3667089