Android h264 硬编码 软编码

音视频编解码! 

对于H264视频裸数据编解码问题一直是IPCamera的核心工作,从之前通过ffmpeg软解码,到后面升级为通过Android MediaCodec进行硬解码! 中间走过不少弯路,也历过不少挫折,今天就 Android 硬解码分享自己的一点小心得! 

(备注:2016年在进行Android硬解码开发时有参考网上的相关资源)

工具/原料

  • Mac OS Eclipse开发工具

  • Mac OS电脑

方法/步骤

  1. 1

     

    #  定义相关变量参数 & 创建MediaCodec并配置相关参数

    // Video Constants

    private final static String MIME_TYPE = "video/avc"; // H.264 video

    private  int VIDEO_WIDTH = 1920;

    private  int VIDEO_HEIGHT = 1080;

    private  int TIME_INTERNAL = 0;

    private static  int HEAD_OFFSET = 512;

     

    private MediaCodec mCodec;

    Thread readFileThread;

     

    #  初始化并创建配置相关解码库,设置视频高宽等参数;

    #  设置用于显示视频的surface (mSurHolder.getSurface());

     

    mCodec = MediaCodec.createDecoderByType(MIME_TYPE);

    MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE,VIDEO_WIDTH, VIDEO_HEIGHT);

    mCodec.configure(mediaFormat, mSurHolder.getSurface(),null, 0);

    mCodec.start();

    Android h264 硬编码 软编码_第1张图片

     

  2. 2

    # 接收到H264裸数据后,通过onFrame(byte[] buf, int offset, int length) 进行实时解码并实时显示视频画面;

    Android h264 硬编码 软编码_第2张图片

  3. 3

    # 解码完成后,通过mCodec.stop(); 反初始化解码器;

     

    # 解码后面画面如下: 

    Android h264 硬编码 软编码_第3张图片

  4. 4

    H264裸数据硬件解码 流程:

      1.创建并初始化相关解码器参数;

      2.将H264裸数据放入inputBuffer;

      3.将inputBuffer入列进行解码;

      4.获得一个outputBuffer的索引(出列);

      5.释放outputBuffer

      6.在4,5间循环直到没有outputBuffer可出列为止;

     

    备注:解码流程参考网上资源,并验证有效! 

    END

注意事项

  • 在进行H264视频界面前,需要判断手机是否支持硬件界面;

  • 通过调用手机GPU进行硬解码,长时间测试,手机有发热情况;

  • 通过硬件解码需要需要合理并即时释放解码器资源,否则会造成界面不稳定,闪退等情况

  • 实测-解码IPcamera 1080P实时视频20FPS. 效果不错!

你可能感兴趣的:(Mediacodec硬编解码)