Android H265转码nv21 示例代码
时间: 2023-08-05 14:11:17 浏览: 161
ffmpeg4.4_h265.7z
以下是一个简单的 Android H265 转码示例代码,它将从相机捕获的 YUV420 数据流转换为 NV21 格式,并使用 MediaCodec API 将其编码为 H265 格式。
```java
private static final String MIME_TYPE = "video/hevc";
private static final int FRAME_RATE = 30;
private static final int I_FRAME_INTERVAL = 1;
private MediaCodec mEncoder;
private void startEncoding() {
MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, I_FRAME_INTERVAL);
mEncoder = MediaCodec.createEncoderByType(MIME_TYPE);
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mEncoder.start();
}
private void encodeFrame(byte[] data) {
int inputBufferIndex = mEncoder.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = mEncoder.getInputBuffer(inputBufferIndex);
inputBuffer.clear();
inputBuffer.put(data);
mEncoder.queueInputBuffer(inputBufferIndex, 0, data.length, 0, 0);
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mEncoder.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = mEncoder.getOutputBuffer(outputBufferIndex);
// do something with the outputBuffer
mEncoder.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mEncoder.dequeueOutputBuffer(bufferInfo, 0);
}
}
```
在这个示例中,`startEncoding()` 方法配置和启动了编码器,`encodeFrame()` 方法将 YUV 数据流送入编码器并获取 H265 格式的输出。请注意,为了使编码器能够接受 YUV420 数据流,我们将其设置为 `MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible` 格式。
此外,由于 H265 编码器可能会产生延迟,因此在使用 `dequeueOutputBuffer()` 获取编码输出时,我们可以指定一个非零的超时时间,以等待输出可用。
阅读全文