Android开发探索iOS开发技术程序员

「Android」Android视频编码那点破事(序章)

2018-04-25  本文已影响409人  Alimin利民

目录

序章

第一章,使用SurfaceTexture作为Camera输出

第二章,使用TextureView渲染Camera画面

第三章,使用OpenGL为Camera添加各种滤镜

第四章,使用MediaCodec实现H264编码

第五章,使用MediaCodec编码AAC音频数据

第六章,使用MediaMuxer对音视频进行混合封装

第七章,在Linux下编译Android版X264

第八章,使用X264实现H264编码


序章

  最近一直把时间花在了摄影上,已经很久没有记录总结一些知识点了。说来也挺尴尬的,今年又换了一次工作。麻烦事也很多云云,十字路口总会发生很多事故。换新工作后难得有机会闲下来,花点时间写点文字,分享一些知识点。这次是纯干货。
  说来也巧,感觉我的工作已经跟视频编解码杠上了。大学那会因为一个比赛项目接触了视频编解码,工作后的第一份工作也跟视频相关。很遗憾,那时候才疏学浅,虽然实现了出来,但对于这一块并没有很深入的理解,以至于多多少少有点问题。之后换了一次工作,没能长久。今年又换了一次,难得沉下心来研究了一下,很庆幸有所突破。


  其实这一两年关于Android 平台的视频编解码学习资料已经很多了,包括书籍和网上的一些公开教程。书籍讲得详细一点,所以推荐大家去买些书籍看看。而网上的资料的话,大多是零星点点,新手学习起来并不是很轻松,包括我。所以这也是促使本人对这一块知识做记录的原因。
  我打算开几个章节来分享一下相关的知识点,因为想详细展开,内容可能有点多,也算是做一些个人笔记。

  这个笔记的主要内容是,使用硬编和软编的方式解决Android视频编解码的问题(后续会支持解码),并且使用OpenGL实现滤镜渲染,包括美颜,水印等等。该项目已经开源再Github上

Github:HardwareVideoCodec

目前已经迭代到了1.2.1版本,使用GPL开源协议,请大家遵守该协议,为开源事业做点贡献。名字虽然叫做硬编解码器,但其实已经扩展了软编。
HardwareVideoCodec使用Kotlin实现,没有学过Kotlin的不需要害怕,先去看一些语言基础就可以了。


知识点

  以上内容我会选一部分在接下来的时间里详细展开,尤其是OpenGL和编码那一块。

可能有人有疑问,软编解码首选的不是大名鼎鼎的ffmpeg吗,为什么直接使用x264。这里我可以很负责任的告诉你,直接使用x264,再配合MediaMuxer使用会简单很多,也是因为硬编同样会用到MediaMuxer。

  大家都知道ffmpeg其实就是在众多编解码器上套个壳子,再集成一个混合器,虽然功能众多,但是却很臃肿(当然已经很出色了),以至于我来了来来回回学习了4+次也没有掌握。ffmpeg的头文件相当多,相比之下,x264只有一个头文件,没几个方法,掌握起来很容易。对于编解码常常用到的颜色格式(ColorFormat)转换,ffmpeg提供了swscale,功能虽然很强大,但效率不敢恭维,完全可以使用google的libyuv替代。所以,如果没有很复杂的功能需求,还是老老实实的使用x264来的方便。

  先简单看一下HardwareVideoCodec的结构图:

简单结构图 详细结构图

  从结构图中可以看到,HardwareVideoCodec做了比较详细的分层结构,从上往下总共四层

上一篇 下一篇

猜你喜欢

热点阅读