其实老早就想写一些关于音视频学习的文章了,但因为各方面的缘由迟迟都没有开始。一个方面是由于笔者写文章都是成系统的,音视频须要你们有必定的 c/c++ 基础;还有一个方面是由于以前经验不足,这一块涉及到的细节也比较多。我本身学习时看过大量的文章和资料,这里推荐 雷霄骅的专栏 ,虽然文章的更新永远停在了那一刻,但其无私分享的精神值得咱们每个开发者学习。音视频这系列文章咱们打算从基础开始学,而后结合移动端 NDK 来开发。所以若是你已是音视频开发的老司机,那么本文可能不太适合你,其次若是以前没了解过 NDK 开发,学习起来也可能会有些难度。linux
目前市面上咱们所熟悉的音视频开发大体有:视频播放器、短视频、视音频直播 等等,他们之间有不少的共性像音视频编解码、视音频同步等,所以咱们首先来看下这些共性内容。假设咱们如今要播放一个本地视频,须要通过哪些步骤呢?你们不妨本身先思考一下,固然这里不是说集成 ijkplayer 或者 ExoPlayer 等开源库,目前只给一个 SurfaceView 和一个视频文件,在此基础上实现一个视频播放。咱们先来看一个简单的流程图:c++
上面这张图咱们务必得要记在内心,想必理解这么一张图对于你们来讲应该 soEasy 。不少东西都是一通百通的,以前就讲过怎么解析一张图片,咱们再涣散一下思惟,假如去解析加载一个 dex/class 文件呢?基于上面这个图,咱们再来看一些具体的细节:git
解封装github
将输入的封装格式的数据(文件),分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类不少,具体能够参考下面这张表,它的做用就是将已经压缩编码的视频数据和音频数据按照必定的格式放到一块儿。例如,FLV 格式的数据,通过解封装操做后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。算法
名称 | 推出机构 | 支持的视频编码 | 支持的音频编码 |
---|---|---|---|
AVI | Microsoft Inc. | 几乎全部格式 | 几乎全部格式 |
MP4 | MPEG | MPEG-2, MPEG-4, H.264, H.263等 | AAC, MPEG-1 Layers I, II, III, AC-3等 |
TS | MPEG | MPEG-1, MPEG-2, MPEG-4, H.264 | MPEG-1 Layers I, II, III, AAC, |
FLV | Adobe Inc. | Sorenson, VP6, H.264 | MP3, ADPCM, Linear PCM, AAC等 |
MKV | CoreCodec Inc. | 几乎全部格式 | 几乎全部格式 |
RMVB | Real Networks Inc. | RealVideo 8, 9, 10 | AAC, Cook Codec, RealAudio Lossless |
视音频解码shell
将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含 AAC,MP3,AC-3 等等,视频的压缩编码标准则包含 H.264,MPEG2,VC-1 等等。解码是整个系统中最重要也是最复杂的一个环节。经过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如 YUV420P,RGB 等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如 PCM 数据。less
视频编码ide
视频编码的主要做用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而下降视频的数据量。若是视频不通过压缩编码的话,体积一般是很是大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,能够得到更高的视频质量。主要的编码方式有 HEVC(H.265),H.264,MPEG4,MPEG2,VP9,VP8,VC-1 等等。学习
音频编码ui
音频编码的主要做用是将音频采样数据(PCM等)压缩成为音频码流,从而下降音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。可是通常状况下音频的数据量要远小于视频的数据量,于是即便使用稍微落后的音频编码标准,而致使音频数据量有所增长,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,能够得到更高的音质。主要的编码方式有 AAC,AC-3,MP3,WMA 等等。
FFmpeg
整个音视频技术学习的核心就在协议和编解码,其中最复杂重要的部分当属编解码了,若是没有基础的话,咱们能够买一些书看一下,实体书或电子书都行。若是真的只给你们一个文件和一个 SurfaceView ,第一步解封装估计就得难倒一大部分人。所以若是是初学习音视频技术,仍是建议你们基于一些第三方的开源库来实现功能,等时机成熟了再去了解底层的源码和算法。我选的是一个经常使用的同时也是你们比较熟悉的开源库 FFmpeg。因此后面咱们基于 FFmpeg + NDK 来开发音视频,等有了必定的经验咱们再去阅读源码学习算法。
准备工做
首先咱们得去编译 FFmpeg 的 so 库文件,而编译 so 库又涉及到 shell 脚本和 cmake 语法知识,因此咱们又须要一个 linux 环境。我当初在学习这些基础知识时,买的是半年的云主机服务,若是你们原本就是用的 linux 系统或 mac 系统,那么就不必再去购买云主机了。考虑到 Android 底层自己也是基于 linux 内核,趁着买了云主机的这个机会,我把 linux 内核的基础也学习了一遍。因此将来几个月的文章和视频,基本都是一些关于 shell 脚本,cmake 语法,linux 内核,音视频编解码,音视频通话,视频直播 等知识。
视频地址:pan.baidu.com/s/1J4smfhiP…
视频密码:7b83