我手動讀取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.因此,我認爲框架應該毫不遲延地呈現。
我想將框架渲染到紋理而不必放置其他框架。
+1
我不認爲這是h264解碼器的本質,它很可能是MediaCodec中的一個缺陷。如果我使用ffmpeg在PC上執行此操作,則不會有任何延遲。 –