您的位置:首页 > 其它

SDL 与 FFMPEG 音乐播放器开发(3)——改变音量、跳转

2015-12-23 15:51 525 查看
上一次贴上了多音频播放的代码,其实我们经常不需要同时播放那么多音频,不过其实也是顺便更深一点的解释SDL播放音频的过程。这次说说怎么改变音量和跳转音乐,最后还会加上一点点通过改变AudioDevice属性,将播放的音频变频的方法。

说到底,改变音量只不过改变几个属性值罢了。上次贴的代码当中,我有自己新建的结构体,其中有一项是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: