七、解决FFmpeg播放时杂音

一、播放杂音的原因

  • 音频数据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;
	}
}

github:https://github.com/ZhouHanyu18/SimplePlayer

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值