Firefly开源社区

打印 上一主题 下一主题

(代码流)Android硬编解码

63

积分

0

威望

0

贡献

技术小白

积分
63

(代码流)Android硬编解码

发表于 2014-11-26 11:10:44      浏览:51896 | 回复:30        打印     [复制链接] 楼主
本帖最后由 bunchen 于 2014-12-13 10:56 编辑

Android硬编解码主要用MediaCodec实现。以下是Android官方的使用说明:

  1. MediaCodec codec = MediaCodec.createDecoderByType(type);
  2. codec.configure(format, ...);
  3. codec.start();
  4. ByteBuffer[] inputBuffers = codec.getInputBuffers();
  5. ByteBuffer[] outputBuffers = codec.getOutputBuffers();
  6. for (;;) {
  7.    int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
  8.    if (inputBufferIndex >= 0) {
  9.      // fill inputBuffers[inputBufferIndex] with valid data
  10.      ...
  11.      codec.queueInputBuffer(inputBufferIndex, ...);
  12.    }

  13.    int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
  14.    if (outputBufferIndex >= 0) {
  15.      // outputBuffer is ready to be processed or rendered.
  16.      ...
  17.      codec.releaseOutputBuffer(outputBufferIndex, ...);
  18.    } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
  19.      outputBuffers = codec.getOutputBuffers();
  20.    } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
  21.      // Subsequent data will conform to new format.
  22.      MediaFormat format = codec.getOutputFormat();
  23.      ...
  24.    }
  25. }
  26. codec.stop();
  27. codec.release();
  28. codec = null;
复制代码

我就用MediaCodec做一个demo,实现硬编解码摄像的的preview数据。

demo界面如图:


程序界面很简单,右下角是摄像头的预览窗口,中间的经过硬编解码显示出来的数据。
  1. private void doCodec(byte[] data){
  2.                 int et = mEncoder.encode(data , 0 , data.length, buffer1, 0);
  3.                 Log.d("buncodec","encode et="+et);
  4.                
  5.                 int dt = mDecoder.decode(buffer1, 0 , et , buffer2 , 0);
  6.                 Log.d("buncodec","decode dt="+dt);
  7.                
  8.                
  9.                 // 用YuvImage显示 NV21 数据 ,效率不高 ,但只是个demo 。
  10.         YuvImage image = new YuvImage(buffer2,
  11.                 getPreviewFormat(), getPreviewWidth(), getPreviewHeight(),
  12.                 null);
  13.         setData(image,getPreviewWidth(),getPreviewHeight());
  14.         
  15.         image = null ;
  16.         }
复制代码

logcat显示:


从logcat可以看出1280*720的preview数据长度是1280*720*3/2=1382400;
硬编码后数据长度是et 大概在50000以内。
硬解码后数据长度是dt 又回到了1382400。
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2014-11-26 11:14:01      沙发
附上demo代码:
Camcodec.zip (674.55 KB, 下载次数: 546)

我测试用的摄像头是C930E
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2014-11-26 11:15:34      板凳
我测试用的摄像头是罗技的C930E
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2014-11-26 11:44:43      地板
  1. @Override
  2.         protected void onDestroy() {
  3.                 // TODO Auto-generated method stub
  4.                 super.onDestroy();
  5.                 mEncoder.close();
  6.                 mDecoder.close();
  7.         }
复制代码


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

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2016-3-7 14:51:00      5#
mediacodec
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表