初心者の学習のFFmpeg - APIフィルタコールチェーンによって制御達成するために

宣言することであるが[x][y]avfilter=a=x:b=y;avfilter=xxx、使用可能な方法の作成Filter呼び出しチェーンを、そしてほとんどの場合、この方法は信頼性が高く、実用的です。しかし、あなたがしたい場合は精细化、管理AVFilterなど、動的に特定の条件に基づいて生成されたとしてコールチェーンを、AVFilter Graphこの宣言的なアプローチはあまり柔軟性がある(また、動的に決定するために組み立てることができるならば、文字列によって、この文字列が宣言、これまで示唆していようにあなたは本当にあなたが上で読んでいる場合)。

作成する方法についてはまず迅速なブラシアップAVFilter Graph

             +-------+             +---------------------+         +---------------+
             |buffer |             |Filter ..... Filter N|         |   buffersink  |
 ----------> |    |output|------>|input|            |output|---> |input|           |-------->
             +-------+             +---------------------+         +---------------+

トリロジーの作成:

  1. 初期化bufferbuffersink
  2. 他のフィルタの初期化
  3. 入力と出力のグラフセットをフィルタリングします。

前記bufferbuffersink表すGraph開始と終了を。

その後、すぐにパッケージがargsありmovie=t.png[wm];[in][wm]overlay=10:20[out]、そのようなフィルタ-複雑なコマンド。そして、することによりavfilter_graph_parse_ptr、中間フィルタの初期化を完了し、

最後に、でもグラフを取得し、入力と各フィルタの出力を指定します。

さて、どのようにAPIを見てみましょう精细化世代をAVFilter Graph以下のグラフを生成します。

             +-------+             +---------------------+         +---------------+
             |buffer |             |       Filter        |         |   buffersink  |
 ----------> |    |output|------>|input|    Fade      |output|---> |input|           |-------->
             +-------+             +---------------------+         +---------------+

まず、各AVFilterを初期化します。2つのステップがあるAVFilterすべての初期化は、次のように簡略化することができます。

  • avfilter_get_by_name指定AVFilterを見つけるために
  • avfilter_graph_create_filterAVFilterContextを初期化します

同じAVcodecAVCodecContext同じ関係、全てが対応AVFilterContext AVFilter頼る行う(開発中のffmpeg、各コンポーネントは、コンテキストマネージャ、各種パラメータのコンテキストマネージャに対応し、コンポーネントパッケージの実行を呼び出します)。

することでavfilter_get_by_name、インスタンスをAVFilter生成した後、呼び出す必要が続いavfilter_graph_create_filterコンテキストマネージャを初期化します。

次の手順で、初期化シーケンス3 AVFilterによると:

buffer_src = avfilter_get_by_name("buffer");
ret = avfilter_graph_create_filter(&buffersrc_ctx, buffer_src, "in", args, NULL, filter_graph);

ここでの焦点は、について話しますavfilter_graph_create_filterここでは、関数のプロトタイプは次のとおりです。

int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt,
                                 const char *name, const char *args, void *opaque,
                                 AVFilterGraph *graph_ctx);

filt_ctxはAVFilterコンテキストマネージャことを示しています。

AVFilter名がこのJiaosha名でグラフ名に示されている重要ではなく、一意である必要があります。例えばFade AVFilterそれが呼び出すことができるfade1fade2またはifade同様。

引数がこのAVFilterの引数で、このパラメータに注意を払うだけでAVFilter全体ではなく、グラフのパラメータです。のは、使用してみましょうFade例を、引数になりますt=in:st=3:d=3

その上でNULLに一般的に不透明。

最初の3 AVFilterの完了後、このドキュメントの焦点に入りました:avfilter_link

int avfilter_link(  AVFilterContext *   src,
                    unsigned    srcpad,
                    AVFilterContext *   dst,
                    unsigned    dstpad
)

avfilter_link彼らは2 AVFilter(伝説的な満足)をリンクするために使用されました。srcそして、dst送信元と宛先フィルタフィルタを表しています。srcpadこれは表しsrc、N番目の出力端子をdstpad示すdstN番目の入力端子。よく理解されていない場合は、次のチャートで直接見て:


    +-------------+                  +-------------+
    |  src      srcpad 1 ----->   dstpad 3    dst  |
    |           srcpad 2 ----->   dstpad 2         |
    |           srcpad 3 ----->   dstpad 1         |
    +-------------+                  +-------------+

フィギュアの仮定srcdst、それぞれが3つの出力と3つの入力(すべてavfilterだけでフェードのように、非常に多くの入力と出力を持っていますが、複数のオーバーレイがあるではない)を持っています。

そして、srcpaddstpad表さ出力/入力番号です。場合buffer第1の出力端子は、対応するfade第一の入力端子。そして、それは次のようになります。

avfilter_link(buffersrc_ctx, 0, ifade_ctx, 0);

その後fadeに対応する第1の出力端子buffersink入力ので、書き込み:

avfilter_link(ifade_ctx, 0, buffersink_ctx, 0);

いわゆるは、精细化ここでは異なる動的の組み合わせであってもよいコード決意ロジックによって具現化されるAVFilter別のビルドFilter Graphそれはまた、異なる入力/出力端子の組み合わせであってもよいです。

参照サンプルコードifilterまた、参照してくださいにFFmpeg・ゴー・サーバー(ffmpegのWebサーバーの安らかなAPIを提供する試みを)。

おすすめ

転載: www.cnblogs.com/vikings-blog/p/11613245.html