0

ローカル ビデオ ファイルを処理するプログラムに処理ロジックを追加しようとしていますが、次の (成功した) gst-launch コマンドをコードに変換する方法を理解するのに苦労しています (そして、" pad-added" コールバック):

gst-launch filesrc location=/path/to/my/video.avi ! decodebin2 ! autovideosink

の代わりに使用して、gstreamer のbasic-tutorial-3を試してみました。decodebin2audioconvert

data.source = gst_element_factory_make("filesrc", "source");
data.convert = gst_element_factory_make("decodebin2", "uridecoder");
data.sink = gst_element_factory_make("autovideosink", "autodetect");

ただし、例で概説されているように、にリンクdata.convertすることはできません。data.sinkgst_element_link(data.convert, data.sink)常に失敗します。には特別な扱いがあると思いdecodebin2ます。一部の gstreamer ユーザーは、ゴーストパッドと個別のビンを使用して言及していますが、これも迅速な試行の後、成功しませんでした:

data.bin = gst_bin_new("processing-bin");
gst_bin_add_many(GST_BIN(data.bin), data.decoder, data.sink, NULL);
gst_element_add_pad(data.bin, 
                    gst_ghost_pad_new("bin_sink",
                                      gst_element_get_static_pad(data.decoder,"sink")));

デバッグを続行する方法について少し混乱しています。他の誰かがポインタを持っていますか?

以下は、現在のコードの要点を要約したものです: ( gist )

====

更新: コールバックが起動しています。filesrc の場所のファイル名が間違っていたためだと思います (おっと)

以下のアドバイスに従った後、オーディオとビデオのキャップ タイプを取得していることを確認し、パッドが追加されたコールバックでそれらをチェックすることができます。ただし、パッド処理の 1 フレーム後に、次の「リンクされていません」というエラーが表示されます。

Debugging information: gstavidemux.c(5187): gst_avi_demux_loop (): /GstPipeline:gstreamer-test/GstBin:processing-bin/GstDecodeBin2:uridecoder/GstAviDemux:avidemux0:
streaming stopped, reason not-linked
4

2 に答える 2

1

ファイルにオーディオとビデオの両方が含まれている場合、オーディオとビデオの両方のパッドに対してコールバックが呼び出されます。したがって、コールバックでは、パッドのキャップをチェックし、ビデオパッドのみをビデオシンクにリンクしようとしていることを確認する必要があります

于 2012-08-05T19:49:54.013 に答える
1

私が遭遇した主な問題は、ビデオ シンクから静的パッドを取得する必要があるときに、新しいパッドのデコーダーを聞いていたことだと思います。違いを説明するために、要点をコールバック関数で更新しました。

基本的に、それはこの変更に要約されます:

私が変更され

GstPad *sink_pad = gst_element_get_static_pad(data->decoder, "sink");  

次へ

GstPad *sink_pad = gst_element_get_static_pad(data->sink, "sink");
于 2012-08-07T21:15:51.057 に答える