音频重采样产生噪音的原因
1. 输入原始音频采样数不足
int ret = swr_convert(m_swr_ctx,
m_avframe->extended_data,
m_avframe->nb_samples,
(const uint8_t**)m_pcmPointer,
inLen);
class Resample
{
private:
SwrContext* m_swr_ctx;
int m_src_channels;
int m_src_sample_rate;
AVSampleFormat m_src_sample_fmt;
int m_dts_channels;
int m_dts_sample_rate;
AVSampleFormat m_dts_sample_fmt;
public:
Resample(int src_channels, int src_sample_rate, AVSampleFormat src_sample_fmt,
int dts_channels, int dts_sample_rate, AVSampleFormat dts_sample_fmt);
virtual ~Resample();
bool init();
int get_need_bytes();
int get_out_bytes(int srcLen);
bool resample(uint8_t** srcBuf, int& srcLen, uint8_t** dtsBuf, int& dtsLen);
};
#include "Resample.h"
Resample::Resample(int src_channels, int src_sample_rate, AVSampleFormat src_sample_fmt,
int dts_channels, int dts_sample_rate, AVSampleFormat dts_sample_fmt)
{
m_src_channels = src_channels;
m_src_sample_rate = src_sample_rate;
m_src_sample_fmt = src_sample_fmt;
m_dts_channels = dts_channels;
m_dts_sample_rate = dts_sample_rate;
m_dts_sample_fmt = dts_sample_fmt;
m_swr_ctx = NULL;
}
Resample::~Resample()
{
if ( m_swr_ctx ) {
swr_free(&m_swr_ctx);
}
}
bool Resample::init()
{
m_swr_ctx = swr_alloc_set_opts(NULL,
av_get_default_channel_layout(m_dts_channels),
m_dts_sample_fmt,
m_dts_sample_rate,
av_get_default_channel_layout(m_src_channels),
m_src_sample_fmt,
m_src_sample_rate,
0, NULL);
if (!m_swr_ctx) {
return false;
}
int ret = swr_init(m_swr_ctx);
if (ret < 0) {
return false;
}
return true;
}
int Resample::get_need_bytes()
{
return av_get_bytes_per_sample(m_dts_sample_fmt) * m_dts_sample_rate * m_dts_channels;
}
int Resample::get_out_bytes(int srcLen)
{
return av_rescale_rnd(swr_get_delay(m_swr_ctx, m_src_sample_rate) + srcLen, m_dts_sample_rate, srcLen, AV_ROUND_UP);
}
bool Resample::resample(uint8_t** srcBuf, int& srcLen, uint8_t** dtsBuf, int& dtsLen)
{
if ( srcLen < ( av_get_bytes_per_sample(m_dts_sample_fmt) * m_dts_sample_rate * m_dts_channels) ) {
return false;
}
int ret = swr_convert(m_swr_ctx, dtsBuf, dtsLen, (const uint8_t**)srcBuf, srcLen);
if (ret < 0) {
return false;
}
return true;
}