android omx 编码,android让高通编码通过 MediaCodec API工作_android_开发99编程知识库
时间: 2023-10-08 11:05:49 浏览: 255
Android中的OMX编码是指使用OpenMAX(OMX)API来实现视频和音频编码。而在高通处理器上,通常使用高通的硬件编码器来进行编码。
为了让高通编码器能够通过MediaCodec API工作,需要进行以下步骤:
1. 获取高通编码器的名字
```
String codecName = MediaCodecList(REGULAR_CODECS).findEncoderForFormat(format);
```
2. 创建MediaCodec对象
```
MediaCodec mediaCodec = MediaCodec.createByCodecName(codecName);
```
3. 配置MediaFormat参数
```
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, COLOR_FORMAT);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
```
4. 开始编码
```
mediaCodec.start();
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
while (!Thread.interrupted()) {
int inputBufferIndex = mediaCodec.dequeueInputBuffer(TIMEOUT_US);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
int sampleSize = extractor.readSampleData(inputBuffer, 0);
if (sampleSize > 0) {
mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, extractor.getSampleTime(), 0);
extractor.advance();
} else {
mediaCodec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
break;
}
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] outData = new byte[bufferInfo.size];
outputBuffer.get(outData);
if (outData.length > 0) {
// do something with the encoded data
}
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
}
}
```
5. 停止编码
```
mediaCodec.stop();
mediaCodec.release();
```
通过以上步骤,就可以让高通编码器通过MediaCodec API进行编码了。需要注意的是,具体的参数设置和处理流程会根据实际需求进行调整。
阅读全文