Если у вас проблемы с конечным качеством и шумом, возможно, вы неправильно понимаете, как правильно выполнить повторную выборку, или в вашей конфигурации есть ошибка.
Взгляните на этот пример: libswresample-example .
Я не знаком с API FFmpeg, потому что для повторной выборки я склонен использовать libsamplerate .
Что касается старого примера, то это шагичтобы выполнить базовую повторную выборку с помощью FFMPEG:
- Начните с настройки контекста повторной выборки:
//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);
В зависимости от типов входных данных и формата, который вы ожидаете получить в качестве выходных данных., вам нужно будет указать правильный формат.Это эквивалент в C ++ стандарте :
----------------------------------------
| *AV_SAMPLE_FMT_S16* | `std::int16_t` |
| *AV_SAMPLE_FMT_S32* | `std::int32_t` |
| *AV_SAMPLE_FMT_FLT* | `float` |
| *AV_SAMPLE_FMT_DBL | `double` |
| *AV_SAMPLE_FMT_U8P* | `std::uint8_t` |
| ... | |
Получите ваши данные из любого места в нужном формате и оцените количество выборок.
После этого вы можете выполнить повторную выборку за несколько шагов:
Оценить количество выходных выборок
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);
Если у вас есть шумы, возможно, форматы входного и выходного форматов неправильные или качество повторной выборки низкое.
Например, не паникуйте, если вы получаете меньше образцов, чем вы ожидали.Это обычное поведение из-за того, как работает фильтрация.Чтобы получить оставшийся трейлинг, вы можете выполнить шаг 5 с NULL в качестве входных данных, чтобы очистить внутренние данные.