android glsurfaceview +camera+mediaCodec编码,在不影响预览的情况下,如何自定义编码帧率(0-30帧)
时间: 2023-12-30 12:03:33 浏览: 27
在android glsurfaceview +camera+mediaCodec编码中,可以通过设置MediaCodec的参数来自定义编码帧率,具体步骤如下:
1. 创建MediaCodec编码器
```java
MediaCodec mediaCodec = MediaCodec.createEncoderByType(mimeType);
```
2. 配置MediaCodec参数
```java
MediaFormat mediaFormat = MediaFormat.createVideoFormat(mimeType, width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate); // 设置帧率
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
```
其中,frameRate参数即为要设置的帧率值,可以在0-30之间自定义。
3. 启动MediaCodec编码器
```java
mediaCodec.start();
```
4. 循环获取相机预览数据并进行编码
```java
while (mIsRecording) {
// 获取相机预览数据
byte[] input = getCameraData();
// 将获取到的数据传入MediaCodec进行编码
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(input);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, System.nanoTime() / 1000, 0);
}
// 获取编码后的数据
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// 获取到编码后的格式信息,可进行相关初始化操作
MediaFormat newFormat = mediaCodec.getOutputFormat();
// ...
} else if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] output = new byte[bufferInfo.size];
outputBuffer.get(output);
// 处理编码后的数据
// ...
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
}
}
```
通过以上步骤,即可在不影响预览的情况下自定义编码帧率。需要注意的是,帧率的设置只是建议值,并不一定能够达到。