java mediacode_Java MediaCodec.flush方法代码示例

该示例展示了如何在Java中配置和使用MediaCodec进行HEVC解码,并通过flush方法清除解码器状态。代码包括导入MediaCodec库,配置HEVC解码器,处理输入和输出缓冲区,以及在完成解码后调用flush方法。
摘要由CSDN通过智能技术生成

import android.media.MediaCodec; //导入方法依赖的package包/类

private static void renderHevcImage(ByteBuffer bitstream, ImageInfo info, Surface surface) {

long beginTime = SystemClock.elapsedRealtimeNanos();

// configure HEVC decoder

MediaCodec decoder = configureDecoder(info, bitstream.limit(), surface);

MediaFormat outputFormat = decoder.getOutputFormat();

Log.d(TAG, "HEVC output-format=" + outputFormat);

decoder.start();

try {

// set bitstream to decoder

int inputBufferId = decoder.dequeueInputBuffer(-1);

if (inputBufferId < 0) {

throw new IllegalStateException("dequeueInputBuffer return " + inputBufferId);

}

ByteBuffer inBuffer = decoder.getInputBuffer(inputBufferId);

inBuffer.put(bitstream);

decoder.queueInputBuffer(inputBufferId, 0, bitstream.limit(), 0, 0);

// notify end of stream

inputBufferId = decoder.dequeueInputBuffer(-1);

if (inputBufferId < 0) {

throw new IllegalStateException("dequeueInputBuffer return " + inputBufferId);

}

decoder.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);

// get decoded image

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

while (true) {

int outputBufferId = decoder.dequeueOutputBuffer(bufferInfo, -1);

if (outputBufferId >= 0) {

decoder.releaseOutputBuffer(outputBufferId, true);

break;

} else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {

outputFormat = decoder.getOutputFormat();

Log.d(TAG, "HEVC output-format=" + outputFormat);

} else {

Log.d(TAG, "HEVC dequeueOutputBuffer return " + outputBufferId);

}

}

decoder.flush();

} finally {

decoder.stop();

decoder.release();

}

long endTime = SystemClock.elapsedRealtimeNanos();

Log.i(TAG, "HEVC decoding elapsed=" + (endTime - beginTime) / 1000000.f + "[msec]");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值