2010-10-10 6 views
5

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.") 

Odpowiedz

6

znalazłem rozwiązania na własną rękę. Musiałem użyć bloków żądań z Adder i użyć funkcjiGStreamer.

Oto kod źródłowy pracy z niektórymi opisami:

#!/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.") 
Powiązane problemy