(代码流)Android硬编解码
本帖最后由 bunchen 于 2014-12-13 10:56 编辑Android硬编解码主要用MediaCodec实现。以下是Android官方的使用说明:
MediaCodec codec = MediaCodec.createDecoderByType(type);
codec.configure(format, ...);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
for (;;) {
int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
if (inputBufferIndex >= 0) {
// fill inputBuffers with valid data
...
codec.queueInputBuffer(inputBufferIndex, ...);
}
int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
if (outputBufferIndex >= 0) {
// outputBuffer is ready to be processed or rendered.
...
codec.releaseOutputBuffer(outputBufferIndex, ...);
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
outputBuffers = codec.getOutputBuffers();
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// Subsequent data will conform to new format.
MediaFormat format = codec.getOutputFormat();
...
}
}
codec.stop();
codec.release();
codec = null;
我就用MediaCodec做一个demo,实现硬编解码摄像的的preview数据。
demo界面如图:
程序界面很简单,右下角是摄像头的预览窗口,中间的经过硬编解码显示出来的数据。
private void doCodec(byte[] data){
int et = mEncoder.encode(data , 0 , data.length, buffer1, 0);
Log.d("buncodec","encode et="+et);
int dt = mDecoder.decode(buffer1, 0 , et , buffer2 , 0);
Log.d("buncodec","decode dt="+dt);
// 用YuvImage显示 NV21 数据 ,效率不高 ,但只是个demo 。
YuvImage image = new YuvImage(buffer2,
getPreviewFormat(), getPreviewWidth(), getPreviewHeight(),
null);
setData(image,getPreviewWidth(),getPreviewHeight());
image = null ;
}
logcat显示:
从logcat可以看出1280*720的preview数据长度是1280*720*3/2=1382400;
硬编码后数据长度是et 大概在50000以内。
硬解码后数据长度是dt 又回到了1382400。
附上demo代码:
我测试用的摄像头是C930E 我测试用的摄像头是罗技的C930E :lol 看到了工程师,挺靓仔滴 @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mEncoder.close();
mDecoder.close();
}
上传的代码TestActivity的onDestroy漏了一句:
mDecoder.close();
虽然问题不大,但要有始有终。{:3_62:} 看到了楼主了,挺靓仔滴+1:lol :)赞啊! 一个字,帅! 测试例子能不能不要这么帅可以吗{:2_31:} 支持一个