libswresample: swr_convert () не производит достаточно сэмплов

Я пытаюсь использовать ffmpeg / libswresample для повторной выборки потокового аудио в моем приложении c ++. Изменение ширины семпла работает хорошо, и результат звучит так, как и следовало ожидать; однако при изменении частоты дискретизации результат получается несколько трескучим. Я не уверен, что это связано с неправильным использованием библиотеки libswresample или с неправильным пониманием теории пересэмплирования.

Вот мой процесс повторной выборки, упрощенный для демонстрации:

//Externally supplied data
const uint8_t* in_samples //contains the audio data to be resampled
int in_num_samples = 256

//Set up resampling context
SwrContext *swr = swr_alloc();
av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(swr, "in_sample_rate", 44100, 0);
av_opt_set_int(swr, "out_sample_rate", 22050, 0);
av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
av_opt_set_sample_fmt(swr, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0);
swr_init(swr);

//Perform the resampe
uint8_t* out_samples;
int out_num_samples = av_rescale_rnd(swr_get_delay(swr, in_samplerate) + in_num_samples, out_samplerate, in_samplerate, AV_ROUND_UP);
av_samples_alloc(&out_samples, NULL, out_num_channels, out_num_samples, AV_SAMPLE_FMT_FLT, 0);
out_num_samples = swr_convert(swr, &out_samples, out_num_samples, &in_samples, in_num_samples);
av_freep(&out_samples);
swr_free(&swr);

Я подозреваю, что причина, по которой преобразованный звук не звучит правильно, заключается в том, что swr_convert() возвращает 112, где я ожидаю, что он вернет 128 (количество семплов передискретизированного аудио):
При пониженной дискретизации 256 образцов от частоты дискретизации 44100 до частоты дискретизации 22050 должно быть получено 128 образцов, однако swr_convert() производит 112 образцов. Когда это выражено в терминах длительности звука, это также вызывает недоумение. 256 выборок при 44100 = 5,8 мс, но 112 выборок при 22050 = 5,07 мс. Разве процесс понижающей дискретизации не должен изменять длительность передискретизированного звука?

Я также прошел через пример, предоставленный ffmpeg, в котором swr_convert () также возвращает меньшее число, чем я ожидал. Итак, я подозреваю, что проблема не в ошибке в libswresample, а в моем непонимании.

0

Решение

Причина, по которой количество выборок уменьшается, заключается в том, что повторная выборка фильтрует несколько временных смежных выборок. Представьте, что мы проводим повторную дискретизацию с использованием 32-отводного фильтра, для выборки 127 требуется ввод 127–12–12 + 16 (или сопоставимых позиций, скорректированных для корректировки частоты дискретизации). Поскольку у вас есть только 128 входных выборок, вы можете вывести до 112 только в этом примере. Остальное хранится во внутренней очереди до следующего доступного ввода.

Чтобы получить последние (конечные) выборки (когда ввод закончен), введите NULL в качестве ввода, что очистит внутреннюю очередь.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]