一、FFmpeg的基本组成
目前,ffmpeg有7大库,分别为AVFormat, AVCodec, AVFilteer, AVDecoder, AVUtil,Swresample, Swscale,AVDevice七大库组成。
1、AVFormat模块
它实现了对文件的封装(muxing)解封装(demuxing),例如:MP4,flv,ts等文件格式,RTMP(Real Time Messaging Protocol),TRSP(Real Time Streaming Protocol),MMS等网络协议封装格式。在实际需求中,我们可以对avforamt增加自己的封装处理模块,进行媒体封装格式的扩展,增加自己定制的封装格式。
2、AVCodec模块
它实现了大多数常用的编解码格式,支持编码(encoder),也支持解码(decoder), 例如:MPEG4,AAC,MJPEG,H.264(第三方解码器),H.265等解码器,同样,也支持h264对应的x264编码器,h265支持的x265编码器。同理,我们也可以对AVcodec进行拓展,增添我们自己的编解码格式。
3、AVFilter模块
它提供了一个通用的音频,视频,字幕等滤镜处理框架,它的一个使用样例如下:
在这张图中,首先,一个输入文件进行分割成为两个流,一个保存原样([main]),另一个传入[tmp],经过crop滤镜和vflip滤镜处理后,覆盖在[main]流上,并输出新的视频。
例如:ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop = iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
这行命令的刨析:
a、“,”: 用于分割两个相同的Filter线性链,在这里就是crop和vflip
b、“;”: 用于分隔不同的Filter线性链
c、[main][flip] 表示这两个流进行合并,后面overflay表示flip从x = 0, y = H/2这个地方开始覆盖掉。
4、swscale和swresample模块
这两个模块放在一起介绍:
scale:裁剪,是对视频图像进行缩放和像素格式转换。例如:将图像从1080p->720p,将图像数据从yuv420P->YUYV,YUV->RGB。
YUV:Y代表亮度,UV代表色度。用于对视频图形进行压缩。
swresample:重采样,音频需要进行采样,它可以操作音频采样,音频通道(channel)布局转换和调整。
5、命令分析:
例如;ffmpeg -i input.mp4 output.avi
a、-i: input(输入),后面接一个输入文件。
第二个人参数就是输出文件,在这里是output.avi
b、在这里,这两个文件不是简单的进行后缀名的更换,而是对它的封装格式进行了转换,转换过程如下图:
先读取输入流,让后通过Demuxer(调用libavformat的API)对音频包进行解封装,通过Decoder(libavcodec)解包为YUV或PCM数据,然后通过Encoder(libavcodec)对数据进行编码,再通过muxer(libavformat)进行封装,最后成为输出流。
二、ffplay和ffprobe
ffplay:它提供了音视频的显示播放功能
ffprobe:它是一个多媒体分析工具,可用查询你要了解的媒体信息,比如音频的参数,视频的参数,时长等。
例:ffprobe -show_streams 那些年,我们一起追的女孩.mp4
然后,这一章的后面还讲了FFmpeg支持的封装和解封装格式,编码器与解码器支持,通信协议支持,这些知识后面遇到再去查。
上面的语言是经过我自己的整理写的,如果有错误,欢迎纠正!