Napisałem mały skrypt Pythona, który używa wtyczki Adder
do miksowania dwóch strumieni źródłowych.Dodawanie i usuwanie źródeł dźwięku do/z potoku GStreamer on-the-go
Po uruchomieniu programu słychać dźwięk 1kHz generowany przez wtyczkę audiotestsrc
. Po naciśnięciu klawisza Enter inny sygnał testowy o częstotliwości 500 Hz zostanie podłączony do Adder
, aby można było usłyszeć je razem. (Nawiasem mówiąc, naprawdę nie rozumiem, dlaczego powinienem ponownie ustawić potok do stanu odtwarzania, aby usłyszeć miks.) Czy jest jakiś sposób, aby podłączyć nowe źródła bez konieczności ponownego uruchamiania potoku?)
Kiedy ponownie wciskamy Enter, dźwięk 1 kHz powinien zostać usunięty z miksu, a dźwięk 500 Hz powinien dalej grać, ale zamiast tego nic już nie słyszę. Otrzymuję pulse pulsesink.c:528:gst_pulsering_stream_underflow_cb:<pulseaudio_output> Got underflow
w wyjściu debugowania jako ostatnią linię. Naprawdę nie wiem, co spróbować dalej.
Oto pełny kod źródłowy:
#!/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.")