由于工作的需求,研究过了一段时间的Android 的音视频播放渲染以及编辑方面的知识,这里就自己一些浅薄的了解对所了解做一个简单的介绍和记录,如有不对的地方请指正!同时也会记录下硬件解码的情况下完成滤镜的添加。
这里以MP4格式的视频作为介绍,因为在实际的移动开发中,传输播放渲染的基本都是MP4文件。
这里先介绍一些基础概念,当理解了这些,再去查看以及学习关于音视频的一些著名开源项目,如Grafika,ExoPlayer,IJKPlayer,GPUImage等开源项目学习会更加方便!
安利一下自己的库,基于MediaCodec的硬件解码的添加滤镜的库
PinFilter
实现了滤镜的添加,预览,播放,录制功能。
基础概念
音视轨,编解码,软硬解码
VideoTrack(视轨),AudioTrack(音轨)分别对应视频文件的画面和声音的数据存储,一般来说常见的MP4一般都是一条VideoTrack,一条AudioTrack。当然有一些左右声道,背景音或存在多条AudioTrack的情况存在。
无论是声音信息还是图像信息储存在MP4中都是经过编码(encode)的,可以理解为按照一定规则压缩过的。所以你要进行MP4的播放,就需要将图像信息和音频信息取出来,然后经过解码(decode)还原成原始的可供渲染和播放的音视频单元。
以上就是编解码的基础概念,事实上音视频数据在MP4中是以Box的形式存储的,感兴趣的可以自己搜索学习。而MP4无论播放还是处理音视轨都是单独分开的,所以这就需要你将音轨和视轨从MP4文件中分离出来,而这个分离的过程就称之为解复用,所以同理,将音视轨重新合在一起的过程就称之为复用。
所以可以看出来,我要进行视频播放需要做的就是解复用取得音视轨,然后分别进行解码还原成原始可显示的数据,接着去渲染和播放,解复用 -》解码 -》播放。
我们如果要进行视频编辑就需要,解复用 -》解码 -》处理数据-》编码-》复用生成MP4。
而使用代码运行,将Video/AudioTrack解码的方式称为软解码,软解码最出名的就是开源项目FFMPEG,基本上所有的视频领域都有它的影子。
同样,由于软解码/编码是运行在CPU中的,所以无论是在cpu,内存的使用率还是解码效率上面都可能存在一些限制和瓶颈。因此,ffmpeg的实际运用中的优化也是很重要的。
事实上,除了软件码以外,手机,PC等视频播放设备上都存在硬件解码器(一种寄存器)来专门做视频的播放工作,我们把调用硬件解码器进行解码的方式称为硬解码。硬解码无疑在效率上更加高效,但是由于各大厂商的缘故,对于硬件解码器都有自己的调整,所以在硬解码的时候,各种机器的适配就显得尤为重要