ネットワーク経由でオーディオをストリーミングするために gstreamer を使用しています。私の目標は一見単純に見えます: 着信ストリームを特定の時間/バイトしきい値までプリバッファリングしてから、再生を開始します。gstreamer の非常に単純な機能を見落としている可能性がありますが、これまでのところ、それを行う方法を見つけることができませんでした。
私の(簡略化された)パイプラインは次のようになりますudpsrc -> alsasink
。これまでのところ、私の目標を達成するためのすべての試みは、その間にキュー要素を使用してきました:
- 間に queue 要素を追加します。
- プロパティを使用し
min-threshold-time
ます。これは実際には機能しますが、問題は、すべての着信データが最初だけではなく、指定された最小時間をキューで費やすことです。これは私が望んでいるものではありません。 - 前の問題を回避するために、オーディオ シンクにデータが初めて入ったときにキューにコードを通知させようとしました。これは、先ほど設定した min-time プロパティの設定を解除するときだと考えて、 「プリバッファリング」動作。
これは、私が試したコードとほぼ同等です。
def remove_thresh(pad, info, queue):
pad.remove_data_probe(probe_id)
queue.set_property("min-threshold-time", 0)
queue.set_property("min-threshold-time", delay)
queue.set_property("max-size-time", delay * 2)
probe_id = audiosink.get_pad("sink").add_data_probe(remove_thresh, queue)
これは、次の 2 つの理由で機能しません。
- 私のコールバックは、
delay
私が提供した変数よりもずっと早く呼び出されます。 - 呼び出されると、キューに格納されていたすべてのデータが失われます。キューがまったく存在しないかのように再生が開始されます。
私は、このことがどのように機能するかについて根本的な誤解をしていると思います。誰かが私が間違っていることを知っていますか、または代わりに、これを行うための(おそらく)より良い方法を提供できますか? ここでは python を使用していますが、任意の言語での任意のソリューションを歓迎します。
ありがとう。