(代码流)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[inputBufferIndex] 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可以看出1280720的preview数据长度是1280720*3/2=1382400;
硬编码后数据长度是et 大概在50000以内。
硬解码后数据长度是dt 又回到了1382400。

附上demo代码:
Camcodec.zip (675 KB)

我测试用的摄像头是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:}

支持一个

这硬解应该用MediaCodec还是用FFmpeg呢,楼主?

mediacodec

天天为这些发愁……现在解码之后,又出了问题……

请问有linux 下实现硬解码的例子么

支持

顶一个, 楼主我爱你!!!:kiss:

楼主,这个demo手机装进去直接就崩了,rk3288装进去没有图像啊

支持一個

zhichi

顶上去