• 解构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*库进行编程的思维是一致的,可以互相转换。

  • 相关阅读:
    寒假周总结一
    1657. Determine if Two Strings Are Close
    1656. Design an Ordered Stream
    695. Max Area of Island (BFS)
    695. Max Area of Island (DFS)
    Daily Coding Problem: Problem #713
    939. Minimum Area Rectangle
    259. 3Sum Smaller
    29. Divide Two Integers
    16. 3Sum Closest
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/6131329.html
Copyright © 2020-2023  润新知