一、播放杂音的原因
- 音频数据buff的大小不正确
- SDL_MixAudio拷贝stream的数据有问题
二、解决方法
1. 音频数据buff的大小不正确(重采样后samples的大小发生了变化)
源代码:
swr_convert(swrCtx, &out_buffer, 2 * 44100, (const uint8_t **)frame->data, frame->nb_samples);
out_buffer_size = av_samples_get_buffer_size(NULL, out_channel_nb, frame->nb_samples,
out_sample_fmt, 1);
改为:
int len = swr_convert(swrCtx, &out_buffer, 44100, (const uint8_t **)frame->data, frame->nb_samples);
//获取sample的size
out_buffer_size = len * out_channel_nb * av_get_bytes_per_sample(out_sample_fmt);
2. SDL_MixAudio拷贝stream的数据有问题(stream中有空数据)
源代码:
//设置音频数据长度
static Uint32 audio_len;
static Uint8 *audio_pos;
void VideoPlayer::fill_audio(void *udata, Uint8 *stream, int len){
SDL_memset(stream, 0, len);
if (audio_len == 0) //有数据才播放
return;
len = (len>audio_len ? audio_len : len);
SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
audio_pos += len;
audio_len -= len;
}
改为:
static Uint32 audio_len;
static Uint8 *audio_pos;
void VideoPlayer::fill_audio(void *udata, Uint8 *stream, int len){
SDL_memset(stream, 0, len);
while (len > 0)
{
if (audio_len == 0)
continue;
int temp = (len > audio_len ? audio_len : len);
SDL_MixAudio(stream, audio_pos, temp, SDL_MIX_MAXVOLUME);
audio_pos += temp;
audio_len -= temp;
stream += temp;
len -= temp;
}
}