Firefly开源社区

1234
发表新贴

(代码流)Android硬编解码

63

积分

0

威望

0

贡献

技术小白

积分
63
发表于 2014-11-26 11:10:44     
本帖最后由 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界面如图:
kkk.jpg

程序界面很简单,右下角是摄像头的预览窗口,中间的经过硬编解码显示出来的数据。
  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显示:
log.png

从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)
回复

使用道具 举报

63

积分

0

威望

0

贡献

技术小白

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

使用道具 举报

3746

积分

17

威望

18

贡献

官方团队

Rank: 9Rank: 9Rank: 9

积分
3746
发表于 2014-11-26 11:35:09     
:lol 看到了工程师,挺靓仔滴
回复

使用道具 举报

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:}
回复

使用道具 举报

发表于 2014-11-26 11:51:39     
看到了楼主了,挺靓仔滴+1:lol
暴走的创客!
回复

使用道具 举报

4

积分

0

威望

0

贡献

游客

积分
4
发表于 2014-11-26 14:00:38     
:)赞啊!
回复

使用道具 举报

82

积分

0

威望

0

贡献

游客

积分
82
发表于 2014-11-26 14:46:28     
一个字,帅!
回复

使用道具 举报

279

积分

10

威望

9

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
279
QQ
发表于 2014-11-26 14:47:08     
测试例子能不能不要这么帅可以吗{:2_31:}
回复

使用道具 举报

148

积分

3

威望

0

贡献

技术小白

积分
148
发表于 2014-12-10 10:52:38     
支持一个
回复

使用道具 举报

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

本版积分规则

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