Firefly开源社区

标题: (代码流)Android硬编解码 [打印本页]

作者: bunchen    时间: 2014-11-26 11:10
标题: (代码流)Android硬编解码
本帖最后由 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。

作者: bunchen    时间: 2014-11-26 11:14
附上demo代码:
Camcodec.zip (674.55 KB, 下载次数: 546)

我测试用的摄像头是C930E
作者: bunchen    时间: 2014-11-26 11:15
我测试用的摄像头是罗技的C930E
作者: jpchen    时间: 2014-11-26 11:35
:lol 看到了工程师,挺靓仔滴
作者: bunchen    时间: 2014-11-26 11:44
  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:}
作者: 暴走的阿Sai    时间: 2014-11-26 11:51
看到了楼主了,挺靓仔滴+1:lol
作者: lishiyang    时间: 2014-11-26 14:00
:)赞啊!
作者: 早起的老鹰    时间: 2014-11-26 14:46
一个字,帅!
作者: ZZP    时间: 2014-11-26 14:47
测试例子能不能不要这么帅可以吗{:2_31:}
作者: Developer_X    时间: 2014-12-10 10:52
支持一个
作者: cangyue1993    时间: 2016-2-19 11:54
这硬解应该用MediaCodec还是用FFmpeg呢,楼主?
作者: bunchen    时间: 2016-3-7 14:51
mediacodec
作者: 脑残丞相    时间: 2016-3-18 14:21
天天为这些发愁……现在解码之后,又出了问题……
作者: scsi    时间: 2016-6-4 19:12
请问有linux 下实现硬解码的例子么
作者: cloudliu    时间: 2016-6-15 13:42
支持
作者: shufeng17    时间: 2016-6-15 16:29
顶一个, 楼主我爱你!!!:kiss:
作者: sankycui    时间: 2016-8-29 14:10
楼主,这个demo手机装进去直接就崩了,rk3288装进去没有图像啊

作者: Gyver    时间: 2016-12-23 11:46
支持一個
作者: shiqizheng    时间: 2017-1-13 15:30
zhichi
作者: csworld    时间: 2017-3-11 13:54
顶上去
作者: youxiw2000    时间: 2017-3-27 11:25
学习一下
作者: dengluyong    时间: 2017-4-19 10:02
谢谢
作者: 吟风子燕    时间: 2017-5-12 16:11
感谢!好东西
作者: xiangxubo    时间: 2017-6-21 09:23

:)赞啊!
作者: 2273431063    时间: 2017-7-3 16:07
我用 Android硬编解码 MediaCodec类 能解h264,但是解mjpeg的时候返回报错信息。我在media_codecs.xml里面看见 <MediaCodec name="OMX.rk.video_decoder.mjpeg" type="video/mjpeg"/>,所以解码的时候把MediaCodec.createDecoderByType("video/avc");改成MediaCodec.createDecoderByType("video/mjpeg");,但是报错。请问是不是什么地方还有改?
作者: 高丰考博    时间: 2017-9-29 09:56
牛逼  膜拜大神
作者: LinyuHsieh    时间: 2018-12-21 09:31
感谢分享
作者: LinyuHsieh    时间: 2019-1-11 09:17
我想问一下,这是H264硬解还是H265的硬解码?
作者: leogift_5815    时间: 2019-1-19 18:36
非常感谢

作者: luckxu    时间: 2019-2-12 22:11
支持,先保存了~
作者: luipingwei    时间: 2020-7-20 13:47
you Linux 版本的吗?




欢迎光临 Firefly开源社区 (https://dev.t-firefly.com/) Powered by Discuz! X3.1