Как получить список частот дискретизации звука моего устройства с помощью PyAudio или PortAudio?

Я хотел бы запросить мое аудиоустройство и получить все доступные частоты дискретизации. Я использую PyAudio 0.2, который работает поверх PortAudio v19, на машине Ubuntu с Python 2.6.

3 ответов


в распределении pyaudio, test/system_info.py показывает, как определить поддерживаемые частоты дискретизации для устройств. Вижу раздел, который начинается с строки 49.

короче говоря, вы используете PyAudio.is_format_supported метод, например


devinfo = p.get_device_info_by_index(1)  # Or whatever device you care about.
if p.is_format_supported(44100.0,  # Sample rate
                         input_device=devinfo['index'],
                         input_channels=devinfo['maxInputChannels'],
                         input_format=pyaudio.paInt16):
  print 'Yay!'

С sounddevice модуль, вы можете сделать это так:

import sounddevice as sd

samplerates = 32000, 44100, 48000, 96000, 128000
device = 0

supported_samplerates = []
for fs in samplerates:
    try:
        sd.check_output_settings(device=device, samplerate=fs)
    except Exception as e:
        print(fs, e)
    else:
        supported_samplerates.append(fs)
print(supported_samplerates)

когда я попробовал это, я получил:

32000 Invalid sample rate
128000 Invalid sample rate
[44100, 48000, 96000]

вы также можете проверить, поддерживается ли определенное количество каналов или определенный тип данных. Для получения более подробной информации, проверить документацию: check_output_settings (). Вы можете, конечно, также проверить, если устройство поддерживается устройства ввода С check_input_settings ().

если вы не знайте идентификатор устройства, посмотрите на query_devices().

Я не думаю, что это все еще актуально, но это также работает с Python 2.6, вам просто нужно удалить скобки из print заявления и заменить except Exception as e: С except Exception, e:.


непосредственно с помощью Portaudio вы можете запустить следующую команду:

for (int i = 0, end = Pa_GetDeviceCount(); i != end; ++i) {
    PaDeviceInfo const* info = Pa_GetDeviceInfo(i);
    if (!info) continue;
    printf("%d: %s\n", i, info->name);
}

благодаря другому потоку