从GStreamer的管道添加和删除音频源/在这去 [英] Adding and removing audio sources to/from GStreamer pipeline on-the-go

查看:1448
本文介绍了从GStreamer的管道添加和删除音频源/在这去的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写它使用一个加法器插件混合两个源一起流了一点Python脚本。

在启动程序后,会听到由 audiotestsrc 插件生成1kHz的基调。当你preSS输入,让你听到他们在一起的另一500Hz的测试音连接到加法器。 (顺便说一句,我真的不明白我为什么要重新设置管道输送到这里打状态听到组合。有什么办法,我可以在新源插上无需重启管道?)

在preSS再次输入,1kHz的基调应该从结构和500Hz的基调应该继续打球删除,而是我听到什么了。我收到了脉冲pulsesink.c:528:gst_pulsering_stream_underflow_cb:其中,pulseaudio_output>在调试输出作为最后一行溢了。我真的不知道下一个尝试的东西。

下面是完整的源代码code:

 #!的/ usr / bin中/蟒蛇
#在-The-Go的源去除不起作用这种方式在GStreamer。为什么?进口图形对象;
gobject.threads_init()
进口消费税;如果__name__ ==__main__:
    管= gst.Pipeline(mypipe)    加法器= gst.element_factory_make(加法,audiomixer)
    pipe.add(加法)    蜂鸣器= gst.element_factory_make(audiotestsrc,蜂鸣器)
    buzzer.set_property(频率,1000)
    pipe.add(蜂鸣器)    脉冲= gst.element_factory_make(pulsesink,pulseaudio_output)
    pipe.add(脉冲)    buzzer.link(加法)
    adder.link(脉冲)
    pipe.set_state(gst.STATE_PLAYING)    的raw_input(1kHz的测试声音preSS<进入方式>要继续)    buzzer2 = gst.element_factory_make(audiotestsrc,buzzer2)
    buzzer2.set_property(频率,500)    pipe.add(buzzer2)
    buzzer2.link(加法)
    pipe.set_state(gst.STATE_PLAYING)    的raw_input(+为1kHz 500Hz的测试声音播放simoultenously preSS< ENTER方式>要继续)    buzzer.unlink(加法)
    pipe.set_state(gst.STATE_PLAYING)    的raw_input(只有500Hz的测试声音preSS<进入方式>停止)


解决方案

我发现我自己的解决方案。我不得不使用要求胶垫加法器和使用的垫堵​​ GStreamer的能力。

下面的工作源$ C ​​$ c。与一些描述:

 #!的/ usr / bin中/蟒蛇进口图形对象;
gobject.threads_init()
进口消费税;如果__name__ ==__main__:
    #首先创建我们的管道
    管= gst.Pipeline(mypipe)    #创建软件调音台加法
    加法器= gst.element_factory_make(加法,audiomixer)
    pipe.add(加法)    #收集请求沉垫,调音台
    sinkpad1 = adder.get_request_pad(下沉%D)    #创建第一个蜂鸣器..
    buzzer1 = gst.element_factory_make(audiotestsrc,buzzer1)
    buzzer1.set_property(频率,1000)
    pipe.add(buzzer1)
    #..和连接它的源焊盘到previously聚集请求垫
    buzzersrc1 = buzzer1.get_pad(SRC)
    buzzersrc1.link(sinkpad1)    #添加一些输出
    输出= gst.element_factory_make(autoaudiosink,AUDIO_OUT)
    pipe.add(输出)
    adder.link(输出)    #开始播放
    pipe.set_state(gst.STATE_PLAYING)    的raw_input(1kHz的测试声音preSS<进入方式>要继续)    #获取混频器的另一个请求沉垫
    sinkpad2 = adder.get_request_pad(下沉%D)    #创建另外一个蜂鸣器和连接同样的方式
    buzzer2 = gst.element_factory_make(audiotestsrc,buzzer2)
    buzzer2.set_property(频率,500)
    pipe.add(buzzer2)    buzzersrc2 = buzzer2.get_pad(SRC)
    buzzersrc2.link(sinkpad2)    #启动第二蜂鸣器(其他方式流因为饥饿而停止)
    buzzer2.set_state(gst.STATE_PLAYING)    的raw_input(+为1kHz 500Hz的测试声音播放simoultenously preSS< ENTER方式>要继续)    #删除源之前,我们必须用垫阻止对prevent状态变化
    buzzersrc1.set_blocked(真)
    #停止第一蜂鸣器
    buzzer1.set_state(gst.STATE_NULL)
    #从搅拌机取消链接
    buzzersrc1.unlink(sinkpad2)
    #释放搅拌机第一片垫
    adder.release_request_pad(sinkpad1)
    #因为这里没有一个加法的sink衬垫块,流继续    的raw_input(只有500Hz的测试声音preSS<进入方式>停止)

I wrote a little Python script which uses an Adder plugin to mix two source streams together.

After starting the program, you hear a 1kHz tone generated by the audiotestsrc plugin. When you press Enter, an another 500Hz test tone is connected to the Adder so you hear them together. (By the way, i don't really get why should i set the pipeline again to playing state here to hear the mix. Is there any way i can plug in new sources without having to restart the pipeline?)

When you press Enter once again, the 1kHz tone should be removed from the mix and the 500Hz tone should keep playing, but instead i hear nothing anymore. I get a pulse pulsesink.c:528:gst_pulsering_stream_underflow_cb:<pulseaudio_output> Got underflow in the debug output as the last line. I don't really know what to try next.

Here is the full source code:

#!/usr/bin/python
# On-the-go source removal doesn't work this way with GStreamer. Why?

import gobject;
gobject.threads_init()
import gst;

if __name__ == "__main__":
    pipe = gst.Pipeline("mypipe")

    adder = gst.element_factory_make("adder","audiomixer")
    pipe.add(adder)

    buzzer = gst.element_factory_make("audiotestsrc","buzzer")
    buzzer.set_property("freq",1000)
    pipe.add(buzzer)

    pulse = gst.element_factory_make("pulsesink", "pulseaudio_output")
    pipe.add(pulse)

    buzzer.link(adder)
    adder.link(pulse)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz test sound. Press <ENTER> to continue.")

    buzzer2=gst.element_factory_make("audiotestsrc","buzzer2")
    buzzer2.set_property("freq",500)

    pipe.add(buzzer2)
    buzzer2.link(adder)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz + 500Hz test sound playing simoultenously. Press <ENTER> to continue.")

    buzzer.unlink(adder)
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("Only 500Hz test sound. Press <ENTER> to stop.")

解决方案

I've found the solution on my own. I had to use request pads with Adder and use the pad blocking capability of GStreamer.

Here's the working source code with some descriptions:

#!/usr/bin/python

import gobject;
gobject.threads_init()
import gst;

if __name__ == "__main__":
    # First create our pipeline
    pipe = gst.Pipeline("mypipe")

    # Create a software mixer with "Adder"
    adder = gst.element_factory_make("adder","audiomixer")
    pipe.add(adder)

    # Gather a request sink pad on the mixer
    sinkpad1=adder.get_request_pad("sink%d")

    # Create the first buzzer..
    buzzer1 = gst.element_factory_make("audiotestsrc","buzzer1")
    buzzer1.set_property("freq",1000)
    pipe.add(buzzer1)
    # .. and connect it's source pad to the previously gathered request pad
    buzzersrc1=buzzer1.get_pad("src")
    buzzersrc1.link(sinkpad1)

    # Add some output
    output = gst.element_factory_make("autoaudiosink", "audio_out")
    pipe.add(output)
    adder.link(output)

    # Start the playback
    pipe.set_state(gst.STATE_PLAYING)

    raw_input("1kHz test sound. Press <ENTER> to continue.")

    # Get an another request sink pad on the mixer
    sinkpad2=adder.get_request_pad("sink%d")

    # Create an another buzzer and connect it the same way
    buzzer2 = gst.element_factory_make("audiotestsrc","buzzer2")
    buzzer2.set_property("freq",500)
    pipe.add(buzzer2)

    buzzersrc2=buzzer2.get_pad("src")
    buzzersrc2.link(sinkpad2)

    # Start the second buzzer (other ways streaming stops because of starvation)
    buzzer2.set_state(gst.STATE_PLAYING)

    raw_input("1kHz + 500Hz test sound playing simoultenously. Press <ENTER> to continue.")

    # Before removing a source, we must use pad blocking to prevent state changes
    buzzersrc1.set_blocked(True)
    # Stop the first buzzer
    buzzer1.set_state(gst.STATE_NULL)
    # Unlink from the mixer
    buzzersrc1.unlink(sinkpad2)
    # Release the mixers first sink pad
    adder.release_request_pad(sinkpad1)
    # Because here none of the Adder's sink pads block, streaming continues

    raw_input("Only 500Hz test sound. Press <ENTER> to stop.")

这篇关于从GStreamer的管道添加和删除音频源/在这去的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆