SDL 与 FFMPEG 音乐播放器开发(3)——改变音量、跳转
2015-12-23 15:51
525 查看
上一次贴上了多音频播放的代码,其实我们经常不需要同时播放那么多音频,不过其实也是顺便更深一点的解释SDL播放音频的过程。这次说说怎么改变音量和跳转音乐,最后还会加上一点点通过改变AudioDevice属性,将播放的音频变频的方法。
说到底,改变音量只不过改变几个属性值罢了。上次贴的代码当中,我有自己新建的结构体,其中有一项是volume,volume便是音量的大小,他限定了mix时候的数据。
所以,只要更改结构体中的volume的值,就可以对播放音乐的音量进行调整。so easy
接下来是跳转音乐。 首先这里需要一点点的音频文件的知识,公式: 存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)
不太理解也没关系,好在现在的PCM文件都标准化了,特别是用FFMPEG解码过后的音频文件,采样频率为44.1KHz,采样位数为16bit,声道是2,
所以最后 储存量=44100*4*t(时间:单位/s),当然这样的方法可以算是小技巧,如果想要纯属的控制音频文件,还需要多学习一些音频文件和乐理的知识。
上代码
像代码中一样改变打开文件的位置指针就可以跳转音乐。
最后加一个小技巧——改变播放音乐的频率
这个方法并没有对音频文件进行处理或者是改变音频文件,他的本质是使SDL打开的Audio设备播放频率改变,从而使得播放的音频频率变快或变慢
改变audio的播放频率,并重启audio。
对于SDL播放PCM说到这里大致也没什么难点了,下一次我将说一下音频文件解码。
以及大家可以联系我125650971@qq.com
说到底,改变音量只不过改变几个属性值罢了。上次贴的代码当中,我有自己新建的结构体,其中有一项是volume,volume便是音量的大小,他限定了mix时候的数据。
void fill_audio(void *udata,Uint8 *stream,int len){ SDL_memset(stream, 0, len); for (int i = 0; i < MAX_MUSIC_DATA; i++) { if (m_data[i].audio_len == 0) /* Only play if we have data left */ continue; len = (len > m_data[i].audio_len ? m_data[i].audio_len : len); /* Mix as much data as possible */ SDL_MixAudio(stream, m_data[i].audio_pos, len, m_data[i].volume); m_data[i].audio_pos += len; m_data[i].audio_len -= len; } }
所以,只要更改结构体中的volume的值,就可以对播放音乐的音量进行调整。so easy
接下来是跳转音乐。 首先这里需要一点点的音频文件的知识,公式: 存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)
不太理解也没关系,好在现在的PCM文件都标准化了,特别是用FFMPEG解码过后的音频文件,采样频率为44.1KHz,采样位数为16bit,声道是2,
所以最后 储存量=44100*4*t(时间:单位/s),当然这样的方法可以算是小技巧,如果想要纯属的控制音频文件,还需要多学习一些音频文件和乐理的知识。
上代码
if (m_data[i].skipSecond != -1)//用户跳转 { float datat = m_data[i].skipSecond * (wanted_spec.freq * 2 * 2); m_data[i].skipSecond = -1; fseek(m_data[i].file, datat, SEEK_SET); }
像代码中一样改变打开文件的位置指针就可以跳转音乐。
最后加一个小技巧——改变播放音乐的频率
这个方法并没有对音频文件进行处理或者是改变音频文件,他的本质是使SDL打开的Audio设备播放频率改变,从而使得播放的音频频率变快或变慢
<pre name="code" class="cpp">if (m_data[i].HzPercent != -1)//用户输入不同赫兹 { wanted_spec.freq = m_data[i].HzPercent*wanted_spec.freq ; m_data[i].HzPercent = -1; SDL_CloseAudio(); SDL_OpenAudio(&wanted_spec, NULL); }
改变audio的播放频率,并重启audio。
对于SDL播放PCM说到这里大致也没什么难点了,下一次我将说一下音频文件解码。
以及大家可以联系我125650971@qq.com
相关文章推荐
- 使用iframe实现提交表单不刷新页面
- <iOS>Git简史
- 查看系统自带的RPM
- display: -webkit-flex; 手机上图下文字,pad上有浮动。
- Android Fragment(碎片)的使用
- ubuntu linux 下wine的使用
- ubuntu 14.0.4LTS安装LNMP php7.0(主要用于个人笔记 勿喷)
- java正则表达式——判断日期格式
- Window.Feature
- windows 环境下 配置git server
- uva188 暴力
- 静态分派和动态分派
- CocoaPods安装和使用教程
- mac 搭建android studio 开发环境
- Android--WebView
- linux64需要增加的依赖库
- Java [Leetcode 226]Invert Binary Tree
- libc、glibc和glib的关系
- Android学习之动画实例
- Dubbo分布式服务框架入门(附工程)