WAV-файлы с любой скоростью, кроме 44,1 кГц, испортили звук

Я использую 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-битные файлы тоже выключены

2

Решение

Похоже, ваше оборудование не способно обрабатывать частоту дискретизации 22,05 кГц для воспроизведения. Тот факт, что функция API возвращает другое значение, является подсказкой.

ALSA — это просто API. Он может делать только то, что поддерживает ваше текущее аппаратное обеспечение. Низкое, самое дешевое, очень дешевое оборудование для воспроизведения звука будет поддерживать несколько частот дискретизации, и это все.

У меня было какое-то специально написанное программное обеспечение для записи и воспроизведения звука, которое сэмплировало и записывало звук с определенной скоростью, а затем воспроизводило его с помощью ALSA. aplay, Когда я получил какое-то новое оборудование, я обнаружил, что новое оборудование все еще способно поддерживать мою частоту дискретизации для записи, для воспроизведения — нет, и aplay просто приступил к воспроизведению ранее записанного звука на ближайшем поддерживаемом уровне воспроизведения, с потрясающими результатами. Я должен был изменить свои собственные написанные вещи для записи и воспроизведения с поддерживаемой скоростью.

Если аппаратное обеспечение не поддерживает запрашиваемую скорость воспроизведения, ALSA не выполнит повторную выборку необработанных аудиоданных. Это зависит от вас, чтобы повторить его, для воспроизведения.

1

Другие решения

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(),

1

Использование «по умолчанию» вместо «hw: 0,0» решает эту проблему, включая слишком низкую частоту дискретизации. «plughw: 0,0» также работает, и это лучше, потому что вы можете выбирать различные устройства / карты программно, тогда как default просто использует значение по умолчанию.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector