android codec h264,Android MediaCodec似乎緩衝H264幀

博主在Android 4.4.4上遇到一个问题,即使用MediaCodec解码RTP/H264流时,发现解码器会缓存多个帧才开始渲染。尽管设置了解码器的输出缓冲区超时时间,但仍然存在延迟。当在解码器中放入一帧后,不会立即渲染到OpenGL纹理,需要等待2-3帧之后才会开始。相比之下,在PC上使用ffmpeg进行相同操作则没有延迟。博主怀疑是MediaCodec的问题,而非H264解码器的本质特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我手動讀取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上執行此操作,則不會有任何延遲。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值