Как обновить семпл Sounddevice? - PullRequest
       11

Как обновить семпл Sounddevice?

0 голосов
/ 03 октября 2018

Я использую sd.Stream для вывода звука и записи с микрофона одновременно.Мне нужно иметь возможность получать вход и выход одновременно для обработки звука в реальном времени, поэтому я использую Stream.Если я использую все файлы, которые используют одну и ту же частоту дискретизации, это работает нормально.Если у меня есть некоторые аудиофайлы, которые не имеют одинаковую частоту дискретизации, я должен иметь возможность изменить частоту дискретизации, используемую Stream.

try:
    stream = sd.Stream(device=(args.input_device, args.output_device),
                        samplerate=args.samplerate, blocksize=args.blocksize,
                        dtype='float32', latency=(0, 0),
                        channels=len(args.channels), callback=callback, finished_callback=finished_callback)
    with stream:
        ani = FuncAnimation(fig, update_plot, interval=args.interval, blit=False, init_func=plot_init)
        plt.show()

Моя первая попытка закрыть поток в законченном вызове:

def finished_callback():
    global stream
    print "just closed"
    stream.close()

, а затем снова открыть поток в update_plot:

if stream.closed and callback.fs_mismatch:
    args.samplerate = callback.new_fs
    callback.fs_mismatch = 0
    stream = sd.Stream(device=(args.input_device, args.output_device),
                       samplerate=args.samplerate, blocksize=args.blocksize,
                       dtype='float32', latency=(0, 0),
                       channels=len(args.channels), callback=callback, finished_callback=finished_callback)
    print "stopped stream and fs mismatch!\n"

Повторное открытие потока, похоже, не имеет никакого эффекта вообще.Я считаю, что причина этого в том, что у меня нет ничего блокирующего после нового потока, как я использую ранее (plt.show).У меня не может быть ничего блокирующего в этом разделе, потому что именно здесь я обновляю свой сюжет.Есть ли способ изменить частоту дискретизации потока после того, как он уже открыт, или есть другой способ выполнить то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 04 октября 2018

Прежде всего, если у вас есть файлы с разной частотой дискретизации, вам следует рассмотреть возможность повторной выборки (также называемой преобразованием частоты выборки).Это то, что обычно делается для решения вашей проблемы.

Во-вторых, PortAudio (библиотека C за модулем sounddevice) не поддерживает изменение частоты дискретизации существующего потока.Существуют другие звуковые платформы, которые теоретически поддерживают это (например, JACK), если вам это действительно нужно.

В-третьих, если вам действительно нужны потоки с разной частотой дискретизации, вы, конечно, можете закрыть один поток и открыть другой с помощьюдругая частота дискретизации.На некоторых платформах вы можете даже иметь несколько потоков (с потенциально разными настройками) одновременно.

Не следует закрывать поток в finished_callback, фактически вы не должны вызывать никаких функций из sounddeviceмодуль там.

Вероятно, не стоит создавать поток в обратном вызове update_plot, потому что он будет уничтожен, когда переменная выйдет из области видимости (что происходит очень быстро, потому что функция обычно оченькратко).

Вероятно, вам следует создать отдельный поток для построения графиков и обработки остановки и перезапуска аудиопотоков в основном потоке (или наоборот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...