0

下面是“理论”管道,它将取消特定用户在音频会议混音器中的音频贡献。理论上是这样的,我们将用户的音频样本从原始样本中反转,最后添加混音器输出中。它应该取消。但是我不知道为什么我不在下面的管道中工作。混音器的想法是它汇总了所有用户的音频贡献,当流回单个用户时,他们的贡献被“反转”+“加法器”元素取消。

我怀疑打卡。还是因为这些管道是分开的,即不在单个管道中?

gst-launch \
  audiotestsrc name="sinewave" wave=sine ! tee name="audio_in_user1" \
  audio_in_user1. ! queue ! audioconvert ! amixer.sink0 \
  audiotestsrc wave=ticks ! queue ! audioconvert !  amixer.sink2 \
  adder name="amixer" ! tee name="mixerout" \
  mixerout. ! queue ! audio_out_user1.sink1 \
  audio_in_user1. ! queue ! audioinvert degree=1 ! audioconvert ! audio_out_user1.sink1 \
  adder name="audio_out_user1" ! alsasink

根据上述理论工作的示例管道,管道只有一个音频源,并且在加法器中被取消。

音频反转度=1

gst-launch \
  audiotestsrc name="sinewave" wave=sine ! tee name="audiosource" \
  audiosource. ! queue ! audioconvert ! adder.sink0 \
  audiosource. ! queue ! audioinvert degree=1 ! audioconvert ! adder.sink1 \
  adder name="adder" ! alsasink

音频反转度=0.55

gst-launch \
  audiotestsrc name="sinewave" wave=sine ! tee name="audiosource" \
  audiosource. ! queue ! audioconvert ! adder.sink0 \
  audiosource. ! queue ! audioinvert degree=0.55 ! audioconvert ! adder.sink1 \
  adder name="adder" ! alsasink
4

1 回答 1

1

我假设您想在服务器上实现该算法(在客户端上要困难得多)。

然而,使用您的示例 GStreamer 管道,您很可能最终会遇到时间问题(每个队列对象都可能会延迟音频流,从那时起就不可能取消任何音频)。

为了说明您的要求,我绘制了一个(简化的)管道(传入流在 src[AD] 之前解码,传出流在 stream[AD] 之后编码:

简化的管道,使用简单而强大的 graphviz 工具包创建

黄色框是时间关键的,因此我认为最简单的方法是编写自己的 gstreamer 元素来执行加法和减法工作。然后将队列元素放在元素输入之前(以及元素输出之后;以解决网络延迟问题)。

另一个注意事项:GStreamer 可能会为一个管道使用多个线程(特别是如果它不像你的情况那样是线性的),所以如果你有很多客户端,你可能会达到服务器上的线程限制(参见这个 SO question,我达到了那个限制曾经使用 GStreamer(好吧,我可以将所有内容放在一两个管道中,但我不希望读取错误导致我的所有音频流停止),一个相当简单的自定义插件帮助我解决了这个问题(每个管道之后使用了两个线程而不是八个))。

于 2013-05-10T17:55:13.347 回答