openGL ES 在android中通过MediaCodec RGB转换MP4例子
时间: 2024-02-24 20:55:03 浏览: 164
以下是一个基于OpenGL ES和MediaCodec的RGB转换MP4的示例代码。这个示例代码是基于Android 4.3及以上版本的。
首先,需要在AndroidManifest.xml文件中添加以下权限:
```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```
然后,在Java代码中使用以下代码初始化Encoder:
```java
MediaCodec encoder;
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
encoder = MediaCodec.createEncoderByType("video/avc");
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = encoder.createInputSurface();
encoder.start();
```
在OpenGL ES的渲染循环中,使用以下代码将当前帧渲染到输入Surface上:
```java
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 绘制当前帧
...
// 将当前帧输出到输入Surface上
eglSwapBuffers(eglDisplay, eglSurface);
drawFrameCount++;
while (true) {
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 0);
if (outputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
break;
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
MediaFormat newFormat = encoder.getOutputFormat();
// 将输出格式保存下来
...
} else if (outputBufferIndex < 0) {
// 忽略
} else {
ByteBuffer outputBuffer = encoder.getOutputBuffer(outputBufferIndex);
MediaFormat bufferFormat = encoder.getOutputFormat();
// 将输出Buffer写入MP4文件
...
encoder.releaseOutputBuffer(outputBufferIndex, false);
if ((bufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
// 编码结束
...
}
}
}
```
最后,需要在应用程序退出时释放资源:
```java
encoder.stop();
encoder.release();
```
请注意,这只是一个示例代码,需要根据实际需求进行修改和调整。
阅读全文