Используйте декодер с сумматором - PullRequest
4 голосов
/ 20 января 2011

Я пытаюсь создать аудиопоток с постоянным источником звука (в данном случае audiotestsrc), к которому я могу иногда добавлять звуки из файлов (различных форматов, поэтому я использую декодер) через play_file() метод.Я использую сумматор для этой цели.Однако по какой-то причине я не могу правильно добавить второй звук.Программа не только неправильно воспроизводит звук, но и полностью останавливает исходный аудиотекст.Вот мой код:

import gst; import gobject; gobject.threads_init()

pipe = gst.Pipeline()

adder = gst.element_factory_make("adder", "adder")

first_sink = adder.get_request_pad('sink%d')
pipe.add(adder)

test = gst.element_factory_make("audiotestsrc", "test")
test.set_property('freq', 100)
pipe.add(test)
testsrc = test.get_pad("src")
testsrc.link(first_sink)

output = gst.element_factory_make("alsasink", "output")
pipe.add(output)
adder.link(output)

pipe.set_state(gst.STATE_PLAYING)

raw_input('Press key to play sound')

def play_file(filename):
    adder_sink = adder.get_request_pad('sink%d')

    audiofile = gst.element_factory_make('filesrc', 'audiofile')
    audiofile.set_property('location', filename)

    decoder = gst.element_factory_make('decodebin', 'decoder')

    def on_new_decoded_pad(element, pad, last):
        pad.link(adder_sink)

    decoder.connect('new-decoded-pad', on_new_decoded_pad)

    pipe.add(audiofile)
    pipe.add(decoder)
    audiofile.link(decoder)

    pipe.set_state(gst.STATE_PAUSED)
    pipe.set_state(gst.STATE_PLAYING)


play_file('sample.wav')

while True:
    pass

1 Ответ

4 голосов
/ 21 января 2011

Благодаря moch на #gstreamer я понял, что все источники сумматоров должны иметь одинаковый формат. Я изменил приведенный выше скрипт, чтобы прописные буквы "audio/x-raw-int, endianness=(int)1234, channels=(int)1, width=(int)16, depth=(int)16, signed=(boolean)true, rate=(int)11025" (пример) помещались перед каждым вводом в сумматоре.

...