http://www.cnblogs.com/tocy/p/ffmpeg-basic-learning-1.html
http://www.cnblogs.com/tocy/p/ffmpeg-basic-learning-3.html
http://zyg0227.blog.51cto.com/1043164/1085916

我们大致可以将音视频播放分为4大模块:DataSource、Demuxer(Parser)、Decoder、Output;
主要流程:
播放器从DataSource获取媒体数据,通过Demuxer分离音视频轨道,分别送到相应的音视频解码器,最后将解码后的数据输出到音视频设备。
各部分说明:
- DataSource:数据源包括本地SDcard中的音视频文件,也包括网络数据源,比如:http、http live、RTSP/RTP...,DataSource的作用是将把数据源抽象出来,为下一个demux模块提供它需要的稳定的数据流。DataSource为Demuxer提供原始数据。
- Demuxer:Parser模块,主要是对各种媒体文件的解析,视频文件一般情况下都是按照一定的音视频容器把音视频的流交织在一起。现在有很多不同的容器格式。如ts、mp4、flv、mkv、avi、rmvb等等。demux的功能就是把音视频的数据帧从容器中剥离出来,然后分别送到不同的解码器中。其实音频和视频本身就是2个独立的子系统。容器把它们包在了一起。但是他们都是独立解码的,所以解码之前,需要把它分别分离出来。demux就是干这活的,他为下一步decoder解码提供了数据流。
- Decoder:解码器--播放器的核心模块。分为音频和视频解码器。影像在录制后, 原始的音视频都是占用大量空间, 而且是冗余度较高的数据. 因此, 通常会在制作的时候就会进行某种压缩 ( 压缩技术就是将数据中的冗余信息去除数据之间的相关性 ). 这就是我们熟知的音视频编码格式, 包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264 等等. 音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据. 当然, 编码解码过程基本上都是有损的 .解码器的作用就是把编码后的数据还原成原始数据。视频对于的视频frame,比如(YUV420/RGB),音频的原始数据即:PCM;解码出来的数据会依次的分发到相应的输出设备。
- Output:音视频的输出设备;
音频输出设备:扬声器speaker,听筒earpiece,耳机headset,蓝牙耳机,hdmi等
视频输出设备:显示屏
============================
1 FFmpeg的由来
FFmpeg缩写中,FF指的是Fast Forward,mpeg是 Moving Pictures Experts Group的缩写。官网:ffmpeg.org
编译好的可执行程序也可以从官网上下载。当然你也可以自己搭建编译环境编译。
2 FFmpeg命令行工具
主要包括:
- ffmpeg 快速的音频、视频编码器/解码器
- ffplay 多媒体播放器
- ffprobe 多媒体文件特征解析
同时FFmpeg编译之后包含libavcodec、libavformat、libavdevice、libavfilter、libavutil、libpostproc、libswresample、libswscale。
3 ffmpeg命令行格式
ffmpeg.exe [global options] [input file options] -i input_file [output file options] output_files
[]表示可选的参数
4 ffplay命令行格式
ffplay和ffmpeg命令行参数一致,只是ffplay没有输出相关的参数。
比如: ffmpeg -i input_file ... test_options ... output_files
使用ffplay可以直接预览
ffplay -i input_file ... test_options
5 ffmpeg中数值前缀或后缀语法
ffmpeg中表示数字可以使用K、M、G形式的后缀,分别表示千、兆、吉;默认是10进制的,可以使用后缀B表示以2为单位的KB、MB、GB等。比如在设置转码率的时候可以使用下面几种形式表示视频编码码率为1.5Mb:
ffmpeg -i input.avi -b:v 1500000 output.mp4
ffmpeg -i input.avi -b:v 1500K output.mp4
ffmpeg -i input.avi -b:v 1.5M output.mp4
ffmpeg -i input.avi -b:v 0.015G output.mp4
设置转码码率为10MB,形式如下:
ffmpeg -i input.mpg -b:v 10MB output.mp4
7 ffmpeg转码及filter
ffmpeg转码的基本逻辑是如下图所示:
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
ffmpeg从输入文件(input_file)中通过解复用器(demuxer,包含在libavformat库中)读取到压缩之后的编码数据(encoded data);压缩的数据通过解码器(decoder)的解码,还原为原始的数据(decoded frame,音频PCM、视频YUV),这些数据可作为filter的输入;原始音视频数据通常可以直接传递给编码器(encoder),输出编码后的数据(encoded packet,重新编码),这个过程也可以省略;通过复用器(muxer)的处理输出指定的封装格式。
这里提到filter的概念,在ffmpeg的转码过程中filter是最复杂的。多个filter可以构成filterchain,使用逗号分隔;多个filterchain可以构成filtergraph,用分号分隔。filtergraph分为简单和复杂两种。简单的filtergraph通常是可以线形顺序描述的filtergraph,比如下图:
_______ _____________ _______ ________ | | | | | | | | | input | ---> | deinterlace | ---> | scale | ---> | output | |_______| |_____________| |_______| |________|
复杂的filtergraph通常是具有多个输入输出文件,并有多条执行路径。比如下面的例子,
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
filter在实际使用中语法如下:(注意区分,前面是输出标签,后面是输出标签)
[in_label1][in_label2][...] filter_name=parameters [out_label1][out_label2][...]
举例说明下,先看下面语法:
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
最终的filter是这样的:
[a] [a]pad=2*iw[A] [A]
split overlay=w
[b] [b]hqdn3d[B] [B]
(后续部分内容会介绍不同的filter语法)
8 Lavfi virtual device
-f表示使用filter,而lavfi是libavfilter virtual input device的别名。其支持的命令行格式如下:
-f lavfi [-graph [-graph_file]]
-graph是作为输入的filtergraph,graph_file表示filtergraph文件的。
比如下面输入显示SMPTE测试图:
ffplay -f lavfi -i smptebars
9 颜色的表示方法
- 固定的名字(可以查看颜色表),比如red、blue;
- 十六进制的颜色描述0xRRGGBB[@AA],注意透明度A必须是浮点数,范围[0.0,1.0]或者十六进制描述(0x前缀);
- #RRGGBB@AA,网页中描述颜色的格式,AA使用十六进制;
- random,系统随机计算一个颜色;
可以用下面语句验证下颜色的描述:
ffplay -f lavfi -i color=c=0xff0000@0.5
ffplay -f lavfi -i color=c=blue
ffplay -f lavfi -i color=c=#0000ff@0x80
ffplay -f lavfi -i color=c=random
10 ffmpeg帮助文档查询
ffmpeg.exe支持以下命令后缀 -h、-h long、-h topic
ffmpeg -h decoder=decoder_name
ffmpeg -h encoder=encoder_name
- 支持的码流filter -bsfs
- 可用的编解码器 -codecs
- 可用的解码器 -decoders
- 可用解码器 -encoders
- 可用filter -filters
- 支持的音视频格式(后缀或文件格式) -formats
- 支持的音频声道layout -layouts
- 支持的像素格式 -pix_fmts
- 支持的协议类型 -protocols
- 支持的音频数字化精度 -sample_fmts
附加说明
本部分内容主要涉及《Ffmpeg Basic》的前两章,建议认真阅读下,这将是后续学习和扩展的基础,不需要全部搞明白,但是需要理解ffmpeg基本的转码、和libavfilter的工作原理。
至于ffmpeg的帮助文档,在需要的时候知道哪里可以找到,可以参考什么就可以了。
参考:http://ffmpeg.org/ffmpeg-filters.html#Filtering-Introduction
浙公网安备 33010602011771号