如何在Gstreamer中动态交换左/右音频输出

时间:2019-01-28 11:30:18

标签: audio gstreamer swap channels

我有一个固定的立体声麦克风和一个旋转的相机。

如何在GStreamer中动态交换音频通道,以使LEFT / RIGHT在耳机中输出LEFT / RIGHT或RIGHT / LEFT。

目前,我可以在启动时交换它们,但是一旦流启动,就无法对其进行更改。

我在C语言中的管道如下所示:

gst-launch-1.0 alsasrc device=plughw:1,0  buffer-time=35000 ! 
    audio/x-raw,channels=2 ! audioamplify amplification=10.0 ! 
    deinterleave name=d interleave name=i ! pulsesink  d.src_0 ! 
    queue ! volume volume=1 ! i.sink_0 d.src_1 ! queue ! 
    volume volume=1 ! i.sink_1

一切正常。现在,如果我想交换接收器,以使LEFT / RIGHT输出变为RIGHT / LEFT,则什么也不会发生。我在documentation上看到这可能行不通,它说“ “尚不支持更改输入上限”。

如果出于某些原因您希望在应该更改的地方查看代码:

void cb_interleave_pad(GstElement *element, GstPad *pad, dizzy_elements *data) {
    gst_element_unlink(data->volume_1, data->interleave);
    gst_element_unlink(data->volume_2, data->interleave);
    gst_element_link_pads(data->volume_1, "src", data->interleave, "sink_1");
    gst_element_link_pads(data->volume_2, "src", data->interleave, "sink_0");
}

void cb_interleave_pad_reverse(GstElement *element, GstPad *pad, dizzy_elements *data) {
    gst_element_unlink(data->volume_1, data->interleave);
    gst_element_unlink(data->volume_2, data->interleave);
    gst_element_link_pads(data->volume_1, "src", data->interleave, "sink_0");
    gst_element_link_pads(data->volume_2, "src", data->interleave, "sink_1");
}

但是,当然,如果不支持此功能,则遵循该路线没有意义。

因此,还有另一个插件/元素可以让我动态交换左右声道吗?

1 个答案:

答案 0 :(得分:0)

audioconvert元素具有mix-matrix属性。看起来您可以根据需要进行处理。查看有关该属性的文档:

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/gst-plugins-base-plugins-audioconvert.html

对于立体声切换,我相信它看起来像这样:

mix-matrix="<<(float)0.0, (float)1.0>, <(float)1.0, (float)0.0>>"

我还没尝试过。