FFmpeg学习之旅
一、序言
只知道FFmpeg是用来做多媒体处理的,听说也可以用来做直播,推流,加水印,视频编解码等,感觉功能挺强大。今天开始一步步来学FFmpeg。
ps:个人主要是做Android开发的,其中Android 3年,java后台1年,前端小白,上学时学过c语言基础,后来自学了一点c++,也是那种刚入门就放弃的,比起c语言,我更倾向于Java。不扯淡了,开搞了。
二、前期准备
- 首先得有c/c++的基础,FFmpeg在Linux下编写的,可移植的c库;
- 开发环境:VS2013,我打算在VS上写好程序,然后再移植到Android上;
- FFmpeg官网下载开发用的库文件,http://ffmpeg.org/
- 学习音视频基础知识。
- 熟悉并使用FFmpeg编写一些小功能。
三、视频播放器原理
1.播放一个视频文件的流程如下所示(附上网上的一张图片):
2.视频查看的一些工具:
- 综合信息查看:MediaInfo
- 二进制信息查看:UltraEdit
- 封装格式:Elecard Format Analyzer
- 视频编码数据:Elecard Stream Eye
- 视频像素数据:YUV Player
- 音频采样数据:Adode Audition
3.封装格式:
视频码流和音频码流按照一定的格式存储在一个文件中。常见的有:(注:网上摘的)
- AVI(Audio Video Interleave): Microsoft开发,扩展名.avi,只能封装一条视频和一条音频,不能封装字幕,没有流媒体功能(就是不能使用它进行在线播放的意思)
- WMV(Windows Media Video): 微软公司开发的一组数字视频编解码格式的通称,ASF(Advanced Systems Format)是其封装格式。 ASF封装的WMV档具有“数字版权保护”功能。扩展名:wmv/asf、wmvhd 其音频编码采用WMA,视频编码采用WMV。
MPEG格式:MPEG(Moving Picture Experts Group):是一个国际标准化组织(ISO)认可的媒体封装形式,受到大部份机器的支持。其存储方式多样,可以适应不同的应用环境。MPEG-4档的档容器格式在Part 1(mux)、14(asp)、15(avc)等中规定。MPEG的控制功能丰富,可以有多个视频(即角度)、音轨、字幕(位图字幕)等等。
MPEG的一个简化版本3GP还广泛的用于准3G手机上。扩展名:dat(用于VCD)、vob、mpg/mpeg、 3gp/3g2(用于手机)等。
MPEG1是最早出现的,VCD这个具体的格式最早是从日本来的并遵从MPEG1规格
MPEG2:其代表是DVD。一般为480P(640*480)。DVD当时都符合这个标准。
Xvid 和H.264同属于MPEG4,MPEG-2还可能称作MPEG2-HD,MPEG2-TS,其实在ITU-T的命名规范中被称之为H.262
H.264有两个名称,一个是沿用ITU-T组织的H.26x名称,叫“H.264”,另一个则是“MPEG-4AVC(MPEG4第10部分)”,AVC意为高级视频编码。
H264的数据压缩率比当前DVD系统中使用的MPEG-2高2-3倍,比MPEG-4高1.5-2倍。
x264编码,是H.264编码的一个开源分支,它符合H.264标准,其功能在于编码(encoding),而不作为解码器(decoder)使用,264编码最大的特点在于注重实用,它在不明显降低编码性能的前提下,努力降低编码的计算复杂度,X264对于H.264编码中的一些复杂编码特性做了折衷处理,其压缩视频体积小于Xvid(MPEG4)编码视频
mp4格式是H.264编码指定使用的标准封装格式,3GP是MP4格式的一种简化版本,减少了储存空间和较低的频宽需求,让手机上有限的储存空间可以使用
可以封装多种多条编码的视频和音频,也可以封装字幕,但没有流媒体功能,可以做成分片式进行流式播放。Matroska 是一种新的多媒体封装格式,这个封装格式可把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内。它也是其中一种开放源代码的多媒体封装格式。Matroska同时还可以提供非常好的交互功能,而且比MPEG的方便、强大。扩展名:mkv
Real Video或者称Real Media(RM) 是由RealNetworks开发的一种档容器。它通常只能容纳Real Video和Real Audio编码的媒体。该档带有一定的交互功能,允许编写脚本以控制播放。RM,尤其是可变比特率的RMVB格式,体积很小,非常受到网络下载者的欢迎。扩展名:rm/rmvb
视频编码有RealVideo G2(早期)( RV40, RV50, RV60 )、RealVideo 8/9/10(RM8, RM9, RM10)
音频编码有RealAudio cook/sipro(早期)、RealAudio AAC/AACPlus等,实际上h264早就把RM挤出历史的舞台。
和avi差不多,但它们都有流媒体功能,区别是rmvb支持可变码率,rm不可变码率,即恒码率。QuickTime File Format 是由苹果公司开发的容器。1998年2月11日,国际标准组织(ISO)认可QuickTime文件格式作为MPEG-4标准的基础。QT可存储的内容相当丰富,除了视频、音频以外还可支持图片、文字(文本字幕)等。扩展名:mov、qt
Ogg Media 是一个完全开放性的多媒体系统计划,OGM(Ogg Media File)是其容器格式。OGM可以支持多视频、音频、字幕(文本字幕)等多种轨道。扩展名:ogg
MOD 格式是JVC生产的硬盘摄录机所采用的存储格式名称
-
MKV:和mp4差不多,但有流媒体功能,可以使用它进行在线播放,还可以使用它封装rv(rm/rmvb)编码呢!
另外:
视频封装格式是MP4,MKV,或者其它,它们都是:视频流,音频流,字幕完全用自己独立的轨道,并且可以是外挂字幕。
字幕后缀名为str,ass,ssa等。这些字幕有自己的特效,什么时候以怎样的形式出现哪些文字,都是由写好的代码控制的。四、FFmpeg组成
libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;五、VS2013配置FFmpeg