文档章节

SDL编程三(音频)

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 357
阅读 1
收藏 0
 

SDL播放声音的基本流程如下:

(1)创建一个回调函数用于混合音频数据,并放入音频流;

(2)设置音频参数,调用SDL_OpenAudio,打开音频设备;

(3)调用SDL_PauseAudio(0),进行音频回放;

(4)回放结束后,调用SDL_CloseAudio() 关闭音频设备。

下面是用SDL播放PCM音频数据的代码。

全局数据:

SDL_AudioSpec wanted;//用于配置音频参数
static Uint8 *audio_chunk;//音频数据缓冲
static Uint32 audio_len;//要播放的音频数据长度(字节)
static Uint8 *audio_pos;//当前播放的位置(字节位置)

步骤(1);

void fill_audio(void *udata, Uint8 *stream, int len)
{
if (audio_len == 0)
{
   printf("audio_len=0\n");
   return;
}

len = (len>audio_len?audio_len:len);
SDL_MixAudio(stream,audio_pos,len,SDL_MIX_MAXVOLUME);//对音频数据进行混音
audio_pos+=len;//更新播放位置
audio_len-=len;//更新数据长度
}

步骤(2)(3)(4);

void AudioPlay(const unsigned char *chunk, int len)
{
//set audio paras
wanted.freq = 44100;//音频的频率
wanted.format = AUDIO_S16;//数据格式为有符号16位
wanted.channels = 2;//双声道
wanted.samples = 1024;//采样数
wanted.callback = fill_audio;//设置回调函数
wanted.userdata = NULL;

if (SDL_OpenAudio(&wanted, NULL)<0)//步骤(2)打开音频设备
{
   printf("can't open audio.\n");
   return;
}

printf("begin....\n");


audio_chunk = (Uint8*)chunk; //设置音频数据缓冲
audio_len = len;//设置音频数据长度


audio_pos = audio_chunk;//设置初始播放位置
SDL_PauseAudio(0);//步骤(3)回放音频数据

printf("don't close, audio playing...\n");
while(audio_len>0)//等待直到音频数据播放完毕!
   SDL_Delay(100);

SDL_CloseAudio();//步骤(4)关闭音频设备
}


© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: 《最简单的基于FFMPEG+SDL的音频播放器》 《最简单的基于FFMPEG+SDL的音频播放器 ve...

leixiaohua1020
2015/07/17
0
0
「SDL第七篇」PCM音频播放器的实现

前言 今天向大家介绍一下如何通过 SDL 实现一个PCM音频播放器。这是一个最简单的播放器,它不涉及到音频的解复用,解码等工作。我们只需要将音频原始数据喂给 SDL 音频接口就可以听到悦耳的声...

音视频直播技术专家
04/12
0
0
SDL2源代码分析1:初始化(SDL_Init())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/01
0
0
《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频

这两天开始带广播电视工程大二的暑假小学期的课程设计了。本次小学期课程内容为《基于 FFmpeg + SDL 的视频播放器的制作》,其中主要讲述了视音频开发的入门知识。由于感觉本课程的内容不但适...

leixiaohua1020
2015/07/26
0
0
Hi3516a移植SDL+FreeType+SDL_ttf

SDL+FreeType+SDL_ttf库编译过程 freeType编译过程 解压: 进入freeType目录: 1 SDL编译过程 解压: 进入SDL目录: 1 出现问题1: 1 解决方法1: 加上,这个错误好像是音频相关的错误,这里...

qq_26671365
01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部