bunchen 发表于 2014-11-26 11:10:44

(代码流)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。

bunchen 发表于 2014-11-26 11:14:01

附上demo代码:


我测试用的摄像头是C930E

bunchen 发表于 2014-11-26 11:15:34

我测试用的摄像头是罗技的C930E

jpchen 发表于 2014-11-26 11:35:09

:lol 看到了工程师,挺靓仔滴

bunchen 发表于 2014-11-26 11:44:43

@Override
        protected void onDestroy() {
                // TODO Auto-generated method stub
                super.onDestroy();
                mEncoder.close();
                mDecoder.close();
        }

上传的代码TestActivity的onDestroy漏了一句:
mDecoder.close();
虽然问题不大,但要有始有终。{:3_62:}

暴走的阿Sai 发表于 2014-11-26 11:51:39

看到了楼主了,挺靓仔滴+1:lol

lishiyang 发表于 2014-11-26 14:00:38

:)赞啊!

早起的老鹰 发表于 2014-11-26 14:46:28

一个字,帅!

ZZP 发表于 2014-11-26 14:47:08

测试例子能不能不要这么帅可以吗{:2_31:}

Developer_X 发表于 2014-12-10 10:52:38

支持一个
页: [1] 2 3 4
查看完整版本: (代码流)Android硬编解码