宣言することであるが[x][y]avfilter=a=x:b=y;avfilter=xxx
、使用可能な方法の作成Filter
呼び出しチェーンを、そしてほとんどの場合、この方法は信頼性が高く、実用的です。しかし、あなたがしたい場合は精细化
、管理AVFilter
など、動的に特定の条件に基づいて生成されたとしてコールチェーンを、AVFilter Graph
。この宣言的なアプローチはあまり柔軟性がある(また、動的に決定するために組み立てることができるならば、文字列によって、この文字列が宣言、これまで示唆していようにあなたは本当にあなたが上で読んでいる場合)。
作成する方法についてはまず迅速なブラシアップAVFilter Graph
。
+-------+ +---------------------+ +---------------+
|buffer | |Filter ..... Filter N| | buffersink |
----------> | |output|------>|input| |output|---> |input| |-------->
+-------+ +---------------------+ +---------------+
トリロジーの作成:
- 初期化
buffer
とbuffersink
。 - 他のフィルタの初期化
- 入力と出力のグラフセットをフィルタリングします。
前記buffer
とbuffersink
表す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_filter
AVFilterContextを初期化します
同じAVcodec
とAVCodecContext
同じ関係、全てが対応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
それが呼び出すことができるfade1
、fade2
または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
示すdst
N番目の入力端子。よく理解されていない場合は、次のチャートで直接見て:
+-------------+ +-------------+
| src srcpad 1 -----> dstpad 3 dst |
| srcpad 2 -----> dstpad 2 |
| srcpad 3 -----> dstpad 1 |
+-------------+ +-------------+
フィギュアの仮定src
とdst
、それぞれが3つの出力と3つの入力(すべてavfilterだけでフェードのように、非常に多くの入力と出力を持っていますが、複数のオーバーレイがあるではない)を持っています。
そして、srcpad
とdstpad
表さ出力/入力番号です。場合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を提供する試みを)。