if (wanted_nb_samples != af->frame->nb_samples) {
int sample_delta = (wanted_nb_samples - af->frame->nb_samples) * is->audio_tgt.freq
/ af->frame->sample_rate;
int compensation_distance = wanted_nb_samples * is->audio_tgt.freq / af->frame->sample_rate;
// swr_set_compensation
if (swr_set_compensation(is->swr_ctx,
sample_delta,
compensation_distance) < 0) {
av_log(NULL, AV_LOG_ERROR, "swr_set_compensation() failed\n");
return -1;
}
}
这段代码是关于音频重采样过程中,如何处理输入和目标样本数不匹配的情况。具体来说,它是在音频重采样的过程中,检测到输入音频的样本数与目标样本数 (wanted_nb_samples
) 不一致时,通过 swr_set_compensation
来进行补偿,以确保重采样后的音频数据能够更好地适配目标设备或目标格式。下面是详细的解释:
代码分解
if (wanted_nb_samples != af->frame->nb_samples) {
- 这一行判断是否目标音频样本数(
wanted_nb_samples
)和当前音频帧中的样本数(af->frame->nb_samples
)不一致。 wanted_nb_samples
是希望得到的样本数,可能是根据目标音频设备的要求或目标采样率计算的。af->frame->nb_samples
是当前音频帧中的样本数。
如果这两个值不同,说明当前音频帧的样本数需要通过补偿或调整来匹配目标样本数。
计算补偿量
int sample_delta = (wanted_nb_samples - af->frame->nb_samples) * is->audio_tgt.freq / af->frame->sample_rate;
sample_delta
是计算需要进行的样本数差异的补偿量。wanted_nb_samples - af->frame->nb_samples
是目标样本数与当前样本数的差值。- 乘上目标采样率
is->audio_tgt.freq
,再除以当前音频的采样率af->frame->sample_rate
,目的是根据目