[英]Adding and removing audio sources to/from GStreamer pipeline on-the-go
我编写了一个Python小脚本,该脚本使用Adder
插件将两个源流混合在一起。
启动程序后,您会听到audiotestsrc
插件生成的1kHz音调。 当您按Enter键时,另一个500Hz测试音将连接到Adder
以便您一起听到它们。 (顺便说一句,我真的不明白为什么我应该在这里再次将管道设置为播放状态以听到混音。有什么方法可以插入新资源而不必重新启动管道吗?)
当您再次按Enter键时,应从混音中删除1kHz音调,并应继续播放500Hz音调,但我什么也没听到。 我得到一个pulse pulsesink.c:528:gst_pulsering_stream_underflow_cb:<pulseaudio_output> Got underflow
在调试输出中出现pulse pulsesink.c:528:gst_pulsering_stream_underflow_cb:<pulseaudio_output> Got underflow
作为最后一行。 我真的不知道下一步该怎么做。
这是完整的源代码:
#!/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.")
我自己找到了解决方案。 我必须将请求垫与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.")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.