随时随地在GStreamer管道中添加音频源和从中删除音频源

发布于 2021-01-29 17:14:18

我编写了一个Python小脚本,该脚本使用Adder插件将两个源流混合在一起。

启动程序后,您会听到audiotestsrc插件生成的1kHz音调。当您按Enter键时,另一个500Hz测试音将连接到,Adder以便您一起听到它们。(顺便说一句,我真的不明白为什么我应该在这里再次将管道设置为播放状态以听到混音。有什么方法可以插入新资源而不必重新启动管道吗?)

再次按Enter键时,应从混音中删除1kHz音调,并应继续播放500Hz音调,但我什么也没听到。我pulse pulsesink.c:528:gst_pulsering_stream_underflow_cb:<pulseaudio_output> Got underflow在调试输出中得到a作为最后一行。我真的不知道下一步该怎么做。

这是完整的源代码:

#!/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.")
关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我自己找到了解决方案。我必须使用请求垫Adder并使用GStreamer的垫阻止功能。

    这是带有一些描述的有效源代码:

    #!/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(sinkpad1)
        # 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.")
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看