我手动读取RTP/H264流并将H264帧传递给Android MediaCodec。我使用“markerBit”作为帧的边界。MediaCodec绑定到OpenGL纹理(SurfaceTexture)。总体而言,一切都正常。但解码器似乎会缓冲帧。如果我将一帧放入解码器中,则不会立即将其呈现到纹理上。在我将2-3帧放入解码器后,第一帧才会呈现到纹理上。
我正在针对Android 4.4.4实现。
在渲染方面,我使用“onFrameAvailable”回调函数来检查是否需要在OpenGL线程上更新纹理。我用一个锁(同步)来保护用于检查的标志。
我怀疑演示时间戳可能会影响渲染。但我将其设置为0。因此,我认为帧应该无延迟地被渲染。
我希望能够在不添加其他帧的情况下将帧渲染到纹理中。
我正在针对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。因此,我认为帧应该无延迟地被渲染。
我希望能够在不添加其他帧的情况下将帧渲染到纹理中。