SDL音频播放
与很多教程是一样的
第一步初始化:SDL_Init(SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS);
第二步,配置音频参数 SDL_AudioSpec audioSpec;创建设备ID:SDL_OpenAudioDevice(SDL_AUDIO_ALLOW_ANY_CHANGE)
第三步:拿到大于0的ID后,启动设备播放SDL_PauseAudioDevice(audioDeviceID, 0);
第四步:音频数据过来后,如果是push进去的,就直接入队就好SDL_QueueAudio(audioDeviceID,data,size)
入队后,还可以查看当当前有多少数据未播放,auto size = SDL_GetQueuedAudioSize(audioDeviceID);
送数据过快,auto size = SDL_GetQueuedAudioSize(audioDeviceID);这里就会很快累积的很多,因为我们也不知道底层音频缓冲容量有多少,所以不知道什么时候送满了,数据溢出了;如果送数据比较慢,比如上一帧据本帧延迟的时间足以播放完当前缓冲的音频了,那就是静音,根据目前的测试情况看并不会因为数据断流,就停止SDL工作;什么时候接着送数据,还是会继续播放声音;
对于pull方案,就是靠底层触发回调来要数据:
1 设置回调函数
SDL_AudioSpec Spec; Spec.format = AUDIO_S16; Spec.freq = samplerate; Spec.channels = channels; Spec.samples = N;//你希望每次底层触发回调要多少数据,这里就写多少采样点数 Spec.silence = 0; Spec.callback = class::audio_callback; Spec.userdata = this; audioDevice = SDL_OpenAudioDevice(nullptr, 0, &Spec, nullptr, SDL_AUDIO_ALLOW_ANY_CHANGE);
audio_callback(void *userdata, Uint8 *stream, int len)这个函数会触发,你把数据拷贝到这个里边:stream;它需要的长度数len;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)