Я написал небольшой скрипт на Python, который использует плагин Adder
для смешивания двух исходных потоков.
После запуска программы вы слышите тон 1 кГц, генерируемый плагином audiotestsrc
. Когда вы нажимаете Enter, к Adder
подключается еще один тестовый сигнал с частотой 500 Гц, поэтому вы слышите их вместе. (Кстати, я не совсем понимаю, почему я должен снова установить конвейер в состояние воспроизведения, чтобы услышать микс. Есть ли способ подключить новые источники, не перезапуская конвейер?)
Когда вы нажимаете Enter еще раз, тон 1кГц должен быть удален из микса, а тон 500Гц должен продолжать играть, но вместо этого я больше ничего не слышу. Я получаю 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.")