解构ffmpeg(一)

ffmpeg应用程序项目将其核心库libav*的使用或编程抽象成FilterGraph,InputFile,OutputFile,InputStream,OutputStream,InputFilter和OutputFilter。

它们的关系为InputFile -- InputStream -- InputFilter -- FilterGraph -- OutputFilter -- OutputStream -- OutputFile。

InputStream和OutputStream分别负责解码和编码应用编程的抽象。

InputFilter和OutputFilter相当于FilterGraph的两个端口,InputStream和OutputStream只管向这两个端口进行送数据或取数据。FilterGraph透明地完成从InputFilter到OutputFilter整条AVFilter链的处理。

InputFile是某种格式的编码源,从此处读入的编码帧被分派到对应的InputStream。

OutputFile是某种格式的编码标,OutputStream的编码过的帧混合在这里。

如果你有相当经验于Windows的DirectShow编程,请区分好ffmpeg的FilterGraph和DS的FilterGraph,勿混肴。在DS的FilterGraph涵盖了整个媒体流,一般形式为SourceFilter -- DemuxerFilter -- DecoderFilter -- FilteringFilter -- EncoderFilter -- MuxerFilter -- DestinationFilter。而ffmpeg的FilterGraph只针对对解码帧的滤镜处理环节。编解码,源格式目标格式的IO不属于FilterGraph的范筹之内。

在这里请区分好ffmpeg应用程序和其核心库libav*。ffmpeg抽象出来的模式使用拉数据。通过OutputStream拉动InputStream端从InputFile读入数据。并不是libav*只能支持拉数据方式。

下面帖上“ffmpeg -i test.mp4 -ss 10 -t 0.1 -f image2 a%03d.png”命令的对象图帮助理解

 

ffmpeg每组命令对应着使用libav*库进行编程的环节,使用ffmpeg命令就像用宏在将各编程环节拼接起来,那当然只是个比喻。使用ffmpeg命令和你如何使用libav*库进行编程的思维是一致的,可以互相转换。

posted on 2016-12-04 17:48  bbqz007  阅读(587)  评论(0编辑  收藏  举报