转载请说明出处!
作者:kqw攻城狮
出处:个人站 | CSDN
效果图
源码
我这里主要是用到了AudioTrack实现的左右声道的控制,手机一般都只有两个声道,即左声道和右声道,我们在输出的时候可以选择单声道,也可以选择双声道(立体声)。
查看了AudioTrack
的API,提供了play()
、pause()
、stop()
、write()
等一系列的方法。
通过write()
方法,可以实现将音频数据发送出去(播放出来)。
AudioTrack对象的构造
有三个构造方法
|
|
主要参数有如下几个
streamType:以什么形式播放
- STREAM_VOICE_CALL
- STREAM_SYSTEM
- STREAM_RING
- STREAM_MUSIC
- STREAM_ALARM
- STREAM_NOTIFICATION
sampleRateInHz:采样率
channelConfig:声道
- AudioFormat.CHANNEL_OUT_MONO:输出单声道音频数据
- AudioFormat.CHANNEL_OUT_STEREO:输出双声道音频数据(立体声)
audioFormat:音频数据格式
mode:缓冲模式
- MODE_STATIC:一次性将音频载入以后再播放
- MODE_STREAM:以流的形式,加载一点就播放一点
把channelConfig的相关参数都看了一遍,没发现有可以指定向某声道发送数据的,只能通过AudioFormat.CHANNEL_OUT_MONO
和AudioFormat.CHANNEL_OUT_STEREO
选择是输出单声道的音频数据还是双声道的音频数据。
左右声道控制
构造的时候不能选择指定声道输出音频,但是有这样一个方法
|
|
可以通过把某一个声道的音量设置到最小,达到只向某个声道输出音频的效果。
我自己也有点”呵呵“,但是也没有发现还有别的方法可以实现这样的效果。
这个方法还有一点小问题,在个别手机上,即使将某个声道的声音设置到了最小,也还是会有一点声音,这个我也还没有搞清楚为什么,个人猜测可能和手机硬件有关系。
封装
我这里的缓冲模式使用的MODE_STREAM
的形式,以流的形式播放,因为这个逻辑要稍微复杂一点,尤其是暂停以后再继续播放的位置。
|
|
使用
从头开始播放
|
|
暂停
|
|
暂停后继续播放
|
|
停止播放
|
|
左右声道控制
|
|
向左右声道单独输出不同的音频数据
也是一个很”呵呵“的做法,但是依然还没有找到更好的方法。
构造两个AudioTrack
对象,分别输出两个音频,一个禁用左声道,一个禁用右声道,达到预期效果。
|
|