これはばかげた質問かもしれません。gstreamer要素はプロセスでどのように複数回ロードされますか?Gstreamer要素が作成されると、すでに作成されてメモリに存在する場合、それらは共有されますか?私の場合、1つのプロセスで複数のスレッドが作成されます。スレッドごとに次のgstreamer要素を作成し、パイプラインをリンクしてPLAYING状態、filesrc->Q->filesinkに設定します。これは機能します。しかし、Q-> filesinkの間にgstreamer要素(gstバッファーデータを処理するために新しく作成されたもの)を追加すると、すべてのスレッドが機能しなくなります。何が問題になる可能性がありますか?どうすればデバッグできますか?入力を提供してください。前もって感謝します。-opensid
2 に答える
要素は共有ライブラリ内にあるため、コードはメモリ内に1回だけ存在します。ただし、各インスタンスは、それ自体の状態のためにいくらかのメモリを占有します。マルチスレッド処理を行う場合は、メインスレッドからgst_init()を1回だけ呼び出す必要があります。gstreamerはすでにデータ処理用の新しいスレッドを作成しているため、1つのメインスレッドからすべてのgstreamerパイプラインを作成する方が節約できます。複数のパイプラインを並行して実行できます。
klassに保存されているデータに適用されるため、ensonicの回答に同意します。ただし、gbufferには適用されないようです。basetransformに基づくIEEE1278オーディオ変換のバージョンを調べています。1つのバージョンには、設定可能なプロパティに基づいてUDPパケットを通過させるフィルタープラグインと、パッドの設定に応じて双方向変換用のプラグインIEEE1278<->mulawがあります。
簡単なテストのために、私はループを試しました:
- gst-launch-1.0 -v filesrc location = IsaacAsimov-Foundation1Of8_64kb.mp3 \
- !mpegaudioparse \
- !mpg123audiodec
- !'audio / x-raw、rate = 8000、channels = 1'\
- !audioresample \
- !'audio / x-raw、rate = 8000、channels = 1'\
- !mulawenc \
- !'audio / x-mulaw、rate = 8000、channels = 1'\
- !dissignalaudio \
- !ディスフィルター\
- !dissignalaudio \
- !'audio / x-mulaw、rate = 8000、channels = 1'\
- !mulawdec \
- !'audio / x-raw、rate = 8000、channels = 1'\
- !自動オーディオシンク
dissignalausio_transformのgbufferデータまたはメタデータに何をしたとしても、出力オーディオには多くの強いクリックノイズがありました。mulawdecのgprintは、私の変換の変更がmulawdecに到達していないことを示しました。UDPループバックを使用してループを2つの起動パイプラインに分割すると、ノイズがなくなりました。どういうわけか、dissignalaudioの最初のインスタンスからのgbufferが2番目のインスタンスをオーバーライドしていました。
学んだ教訓:
双方向変換の例がなく、すべての変換に個別のエンコードプラグインとデコードプラグインがあるのには理由があります。