前言
之前写了很多关于ndk的文章,也以FFmpeg的编译为例大概的讲述了一次ndk开发从编译到使用的过程,但是内容过于分散,而且有些东西已经过时,比如eclipse工具,比如ndk-build的编译方式以及之前ffmpeg使用的2.x的版本,这些都已经渐渐的不被使用了,这次打算在Android Studio的工具下使用Cmake的编译方式,编译较新的ffmpeg版本,完成一次完整的编译开发过程,实现一次功能较完备的ffmpeg播放器。目前最新的ffmpeg是4.x,我这次打算使用3.x的进行编译,因为每一个版本对应的编译脚本也是有所不同的,使用相同的脚本并不能成功的适应所有的version。所以我们必须针对它版本的更新去调整我们的脚本。ffmpeg功能强大,我也是在学习的过程中,有些地方可能写的不够完善,还望各位多多指正。
本文这次主要以音视频的基础内容为主
MPEG-4
一套用于音频、视频信息的压缩编码标准,MPEG4于1998 年11 月公布,原预计1999 年1月投入使用的国际标准MPEG4不仅是针对一定比特率下的视频、音频编码,更加注重多媒体系统的交互性和灵活性。MPEG专家组的专家们正在为MPEG-4的制定努力工作。MPEG-4标准主要应用于视像电话(Video Phone),视像电子邮件(Video Email)和电子新闻(Electronic News)等,其传输速率要求较低,在4800-64000bits/sec之间,分辨率为176X144。MPEG-4利用很窄的带宽,通过帧重建技术,压缩和传输数据,以求以最少的数据获得最佳的图像质量。
常用封装格式
AVI
压缩标准可任意选择,AVI英文全称为Audio Video Interleaved,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。AVI文件将音频(语音)和视频(影像)数据包含在一个文件容器中,允许音视频同步回放。类似DVD视频格式,AVI文件支持多个音视频流。AVI信息主要应用在多媒体光盘上,用来保存电视、电影等各种影像信息。
FLV
流媒体格式,FLV 是FLASH VIDEO的简称,FLV流媒体格式是随着Flash MX的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。
ASF
ASF是(Advanced Streaming Format) 高级串流格式的缩写,是 Microsoft 为 Windows 98 所开发的串流多媒体文件格式。同JPG/JPG、MPG文件一样,ASF文件也是一种文件类型,但是特别适合在IP网上传输。ASF是微软公司Windows Media的核心,这是一种包含音频、视频、图像以及控制命令脚本的数据格式。这个词汇当前可和 WMA 及 WMV 互换使用。利用ASF文件可以实现点播功能、直播功能以及远程教育,具有本地或网络回放、可扩充的媒体类型等优点。
MP4
MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通过,第二版在1999年12月通过。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播。
MPEG-4包含了MPEG-1及MPEG-2的绝大部份功能及其他格式的长处,并加入及扩充对虚拟现实模型语言(VRML , VirtualReality Modeling Language)的支持,面向对象的合成档案(包括音效,视讯及VRML对象),以及数字版权管理(DRM)及其他互动功能。而MPEG-4比MPEG-2更先进的其中一个特点,就是不再使用宏区块做影像分析,而是以影像上个体为变化记录,因此尽管影像变化速度很快、码率不足时,也不会出现方块画面。
常用视频编码格式
H264
H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。
H264标准各主要部分有Access Unit delimiter(访问单元分割符),SEI(附加增强信息),primary coded picture(基本图像编码),Redundant Coded Picture(冗余图像编码)。还有Instantaneous Decoding Refresh(IDR,即时解码刷新)、Hypothetical Reference Decoder(HRD,假想参考解码)、Hypothetical Stream Scheduler(HSS,假想码流调度器)。
WMV
WMV(Windows Media Video)是微软开发的一系列视频编解码和其相关的视频编码格式的统称,是微软Windows媒体框架的一部分。WMV包含三种不同的编解码:作为RealVideo的竞争对手,最初为Internet上的流应用而设计开发的WMV原始的视频压缩技术;另一种是为满足特定内容需要的WMV屏幕和WMV图像的压缩技术;在经过SMPTE(Society of Motion Picture and Television Engineers)学会标准化以后,WMV版本9被采纳作为物理介质的发布格式,比如高清DVD和蓝光光碟,即所谓的VC-1。
Xvid
Xvid是一个开放源代码的MPEG-4视频编解码器,它是基于OpenDivX而编写的。Xvid是由一群原OpenDivX义务开发者在OpenDivX于2001年7月停止开发后自行开发的。Xvid支持多种编码模式,量化(Quantization)方式和范围控,运动侦测(Motion Search)和曲线平衡分配(Curve)等众多编码技术,对用户来说功能十分强大。Xvid的主要竞争对手是DivX。但Xvid是开放源代码的,而DivX则只有免费(不是自由)的版本和商用版本。
MJPEG
MJPEG(技术即运动静止图像(或逐帧)压缩技术)是24-bit的"true-color"影像标准。MJPEG的工作是将RGB格式的影像转换成YCrCB格式,目的是为了减少档案大小,一般约可减少1/3~1/2左右。
常用音频编码格式
AAC
AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
APE
APE是流行的数字音乐无损压缩格式之一,因出现较早,在全世界特别是中国大陆有着广泛的用户群。与MP3这类有损压缩格式不可逆转地删除(人耳听力不敏感的)数据以缩减源文件体积不同,APE这类无损压缩格式,是以更精炼的记录方式来缩减体积,还原后数据与源文件一样,从而保证了文件的完整性。APE由软件Monkey's audio压制得到,开发者为Matthew T. Ashland,源代码开放,因其界面上有只“猴子”标志而出名。相较同类文件格式FLAC,ape有查错能力但不提供纠错功能,以保证文件的无损和纯正;其另一个特色是压缩率约为55%,比FLAC高,体积大概为原CD的一半,便于存储。
FLAC
FLAC中文可解释为无损音频压缩编码。FLAC是一套著名的自由音频压缩编码,其特点是无损压缩。不同于其他有损压缩编码如MP3 及AAC,它不会破坏任何原有的音频资讯,所以可以还原音乐光盘音质。2012年以来它已被很多软件及硬件音频产品(如CD等)所支持。
MP3
MP3是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III),简称为MP3。它被设计用来大幅度地降低音频数据量。利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的文件,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。用MP3形式存储的音乐就叫作MP3音乐,能播放MP3音乐的机器就叫作MP3播放器。
H。264/AVC视频编码标准
视频编码层面(VCL)
-视频数据的内容
网络抽象层面
-格式化数据并提供头信息
NAL单元
每帧数据就是一个NAL单元(SPS与PPS除外),在实际的H264数据帧中,往往帧前面带有00 00 00 01或00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS,接着为帧
GOP
所谓GOP,意思是画面组,MPEG格中的帧序列,分为I、P、B三种,如排成IBBPBBPBBPBBPBBP...样式,这种连续的帧图片组合即为GOP(画面群,GROUP OF PICTURE),是MPEG将来存取的最本基本的单位,它的排列顺序将会一直重复到影像结束。一个GOP就是一组连续的IPB画面。MPEG编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以精确剪辑的原因,也是我们之所以要微调头和尾的原因。
像素格式
yuv和rgb的转换公式,播放视频的时候需要将yuv转换之后才可以进行显示
PCM音频参数
采样率sample_rate 44100 (CD)
通道channels(左右声道)
样本大小 sample_size
样本类型plannar
AV_SAMPLE_FMT_S16在内存的格式为:
c1,c2,c1,c2,c1,c2...
AV_SAMPLE_FMT_S16P在内存的格式为:
c1,c1,c1,...,c2,c2,c2,...