gpt4 book ai didi

c++ - libswresample : swr_convert() not producing enough samples

转载 作者:行者123 更新时间:2023-12-01 15:11:27 29 4
gpt4 key购买 nike

我正在尝试使用 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 个 sample 。当以音频持续时间表示时,这也令人费解。在 44100 = 5.8 ms 时有 256 个样本,但在 22050 = 5.07 ms 时有 112 个样本。下采样过程不应该改变重采样音频的持续时间吗?

我还逐步介绍了 ffmpeg 提供的示例,其中 swr_convert() 返回的数字也比我预期的要小。所以,我怀疑问题不是由于 libswresample 中的错误,而是我自己缺乏理解。

最佳答案

样本数量减少的原因是重采样过滤了许多时间相邻的样本。想象一下,我们正在使用 32 抽头滤波器重新采样,样本 127 需要输入 127-16 到 127+16(或为采样率调整校正的可比较位置)。由于您只有 128 个输入样本,因此在此示例中您最多只能输出 112 个。其余的存储在内部队列中,直到下一个输入可用。

要获得最终(尾随)样本(输入完成时),输入 NULL 作为输入,这将刷新内部队列。

关于c++ - libswresample : swr_convert() not producing enough samples,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39587839/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com