使用ffmpeg解码音频sdl(pull)播放

本文介绍了使用ffmpeg解码音频并利用sdl的pull方式播放的详细过程,包括初始化sdl、打开音频设备、注册回调播放音频以及使用AVAudioFifo进行数据管理。相较于push方式,pull播放更加灵活且易于实现复杂功能,如多路音频合并。注意线程安全和队列管理是关键。
摘要由CSDN通过智能技术生成

自定义播放器系列

第一章 视频渲染
第二章 音频(push)播放
第三章 音频(pull)播放(本章)
第四章 实现时钟同步
第五章 实现通用时钟同步
第六章 实现播放器

前言

我们上一章讲了,ffmpeg解码sdl push的方式播放音频,调用流程简单,但是实现起来还是有点难度的。接下来讲的就是使用pull的方式播放音频,pull的方式即是使用回调的方式播放音频,在打开SDL音频设备的时候传入一个回调方法,SDL内部会按照一定频率回调这个方法,我们在回调方法中往音频缓冲写数据就能够播放声音了。

一、ffmpeg解码

ffmpeg解码部分与《使用ffmpeg解码音频sdl(push)播放》一致,这里就不再赘述。

二、sdl播放

1、初始化sdl

使用sdl前需要在最开始初始化sdl,全局只需要初始化一次即可。

if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
	printf("Could not initialize SDL - %s\n", SDL_GetError());
	return -1;
}

2、打开音频设备

建议使用SDL_OpenAudioDevice打开设备,使用SDL_OpenAudio的话samples设置可能不生效,比较不灵活一点。pull的方式播放其实就是采用回调的方式播放,我们给下面代码的wanted_spec.callback赋值即可。

SDL_AudioSpec wanted_spec, spec;
int audioId = 0;
//打开设备
wanted_spec.channels = av_get_channel_layout_nb_channels(pCodecCtx->channel_layout);
wanted_spec.freq = pCodecCtx->sample_rate;
wanted_spec.format = AUDIO_F32SYS;
wanted_spec.silence = 0;
wanted_spec.samples = FFMAX(512, 2 << av_log2(wanted_spec.freq / 30));
//注册回调方法
wanted_spec.callback =  audioCallback;
wanted_spec.userdata = NULL;
audioId = SDL_OpenAudioDevice
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值