Я использую ALSA в Ubuntu, чтобы попытаться воспроизвести файл WAV. В настоящее время я могу прочитать заголовок wav, чтобы выяснить частоту дискретизации файла, и установить параметры в ALSA для соответствия. Это отлично работает для файлов с частотой дискретизации 44,1 кГц, но другие файлы с частотой ~ 11 кГц или ~ 22 кГц не воспроизводятся правильно. Я не уверен, что правильно устанавливаю частоту дискретизации.
val = realSampleRate;
//Sampling rate to given sampling rate
snd_pcm_hw_params_set_rate_max(handle, params, &val, &dir);
cout << "sampling at " << val << " Hz \n";
Это дает правильный выходной сигнал («выборка при 22050 Гц»), но если я буду следовать этому:
val = realSampleRate;
snd_pcm_hw_params_set_rate_min(handle, params, &val, &dir);
cout << "sampling at " << val << " Hz \n";
на выходе происходит «выборка при 44100 Гц», что явно противоречиво. Я также пытался использовать snd_pcm_hw_params_set_rate_near
но это тоже не работает, говорится, что сэмплирование на частоте 44100 Гц для файла 22050, и звук во всех этих файлах был очень испорчен.
РЕДАКТИРОВАТЬ: Одной из проблем является неправильная частота дискретизации, которая ускорит воспроизведение, но реальная проблема связана с монотреками. Звучание моно треков действительно искажено и очень выключено.
РЕДАКТИРОВАТЬ: 8-битные файлы тоже выключены
Похоже, ваше оборудование не способно обрабатывать частоту дискретизации 22,05 кГц для воспроизведения. Тот факт, что функция API возвращает другое значение, является подсказкой.
ALSA — это просто API. Он может делать только то, что поддерживает ваше текущее аппаратное обеспечение. Низкое, самое дешевое, очень дешевое оборудование для воспроизведения звука будет поддерживать несколько частот дискретизации, и это все.
У меня было какое-то специально написанное программное обеспечение для записи и воспроизведения звука, которое сэмплировало и записывало звук с определенной скоростью, а затем воспроизводило его с помощью ALSA. aplay
, Когда я получил какое-то новое оборудование, я обнаружил, что новое оборудование все еще способно поддерживать мою частоту дискретизации для записи, для воспроизведения — нет, и aplay
просто приступил к воспроизведению ранее записанного звука на ближайшем поддерживаемом уровне воспроизведения, с потрясающими результатами. Я должен был изменить свои собственные написанные вещи для записи и воспроизведения с поддерживаемой скоростью.
Если аппаратное обеспечение не поддерживает запрашиваемую скорость воспроизведения, ALSA не выполнит повторную выборку необработанных аудиоданных. Это зависит от вас, чтобы повторить его, для воспроизведения.
snd_pcm_hw_params_set_rate_max()
устанавливает максимальная частота дискретизации, т. е. при успешном выполнении этой функции частота дискретизации устройства не будет больше указанной вами.
snd_pcm_hw_params_set_rate_min()
устанавливает минимальную частоту дискретизации.
snd_pcm_hw_params_set_rate_near()
ищет ближайшую частоту дискретизации, которая фактически поддерживается устройством, устанавливает ее и возвращает ее.
Если у вас есть аудиоданные с определенной частотой дискретизации, и вы не можете выполнить повторную выборку, вы должны использовать snd_pcm_hw_params_set_rate()
,
Использование «по умолчанию» вместо «hw: 0,0» решает эту проблему, включая слишком низкую частоту дискретизации. «plughw: 0,0» также работает, и это лучше, потому что вы можете выбирать различные устройства / карты программно, тогда как default просто использует значение по умолчанию.