android中 MediaCodec使用示例
时间: 2023-07-30 21:12:04 浏览: 230
android 使用MediaCodec 编解码总结.pdf
MediaCodec 是 Android 系统提供的音视频编解码器,可以用来进行视频压缩、编码、解码等操作。下面是一个简单的 MediaCodec 使用示例:
首先,需要创建一个 MediaCodec 对象,指定需要进行编解码的媒体格式:
```java
private MediaCodec mMediaCodec;
private int mWidth = 640; // 视频宽度
private int mHeight = 480; // 视频高度
private int mFrameRate = 30; // 视频帧率
private int mBitRate = 2 * 1024 * 1024; // 视频码率
private void initMediaCodec() {
try {
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", mWidth, mHeight);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, mBitRate);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mFrameRate);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
mMediaCodec = MediaCodec.createEncoderByType("video/avc");
mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mMediaCodec.start();
} catch (IOException e) {
e.printStackTrace();
}
}
```
然后,需要创建一个 Surface 对象,作为输入数据的源,将视频数据写入 Surface 对象:
```java
private Surface mSurface;
private void initSurface() {
SurfaceTexture surfaceTexture = new SurfaceTexture(0);
mSurface = new Surface(surfaceTexture);
surfaceTexture.setDefaultBufferSize(mWidth, mHeight);
surfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() {
@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture) {
// 视频帧可用,处理视频帧
}
});
}
private void writeFrameToSurface(byte[] data, long timestamp) {
try {
ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
int inputBufferIndex = mMediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(data);
mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, timestamp, 0);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
```
最后,需要从 MediaCodec 中读取编码后的数据,进行处理:
```java
private void handleEncodedData() {
try {
ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
// 处理编码后的数据
mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
```
以上是一个简单的 MediaCodec 使用示例,具体实现可能需要根据实际情况进行调整。
阅读全文