您的位置:首页 > 移动开发 > IOS开发

iOS 简单实现音频的播放

2014-08-09 21:46 417 查看
1、短音播放:

短音是指播放时长小于30秒的声音,而且使用短音播放不能同时播放多个,调用播放方法立即播放,几乎没有可调控的属性,除了播放完会有一个回调。在app的提示音、动作音可以使用这个方法,简单方便。

首先,使用短音的文件路径构建一个SystemSoundID对象:

SystemSoundID _soundID;
NSString * soundPath = [[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"sound"]stringByAppendingPathComponent:soundFileName]; //获取音频文件路径
    NSURL * soundURL = [[NSURL alloc]initFileURLWithPath:soundPath];//使用路径构建NSURL对象
    
    OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL, &_soundID);    //加载音频;
    if (error) {
        NSLog(@"error : %d",(int)error);
        return;
    }
然后使用这个与音频文件关联起来的SystemSoundID来播放声音:
AudioServicesPlaySystemSound(_soundID);
一句话就好了。播放还有一个函数:AudioServicesPlayAlertSound,这个会根据设备提供一些警告音效果,例如震动

还可以添加播放结束后的回调:

AudioServicesAddSystemSoundCompletion(_soundID, NULL, NULL, SoundFinished, NULL);


第一个参数是播放音频的SystemSoundID,第四个是回调的函数,第二个和第三个参数是指定回调函数调用的runloop和相应的runloop模式,最后一个是自定义的传入参数,貌似C类型的回调函数都会有一个自定义的参数,用于提供给回调函数,便于做自定义的操作。
回调函数是AudioServicesSystemSoundCompletionProc类型,定义为:
typedef void    (*AudioServicesSystemSoundCompletionProc) (
   SystemSoundID  ssID,
   void           *clientData
   );
也就是函数有两个参数,一个是注册回调函数时的SystemSoundID变量,还一个就是上面的自定义参数。

2、一般音频播放:***AudioPlayer
***AudioPlayer也是通过资源文件的地址构建,然后调用播放方法,系统自动播放。没有对于声音属性的,例如音轨、频率之类的调控,但可以控制播放的过程,也可以获取音频的信息,适合对声音没有很细致要求的播放,而且简单易用。
首先,使用音频文件地址构建:
NSURL * musicURL = [[NSURL alloc]initFileURLWithPath:musicPath];
_audioPlayer = [[***AudioPlayer alloc]initWithContentsOfURL:musicURL error:&error];
    if (error) {
        NSLog(@"error : %@",error);
        return;
    }
然后播放和控制都基于这个_audioPlayer对象。

播放操作:
[_audioPlayer prepareToPlay];//准备播放
 [_audioPlayer play];//播放
[_audioPlayer pause];//暂停
[_audioPlayer stop]; //停止



对于prepareToPlay,文档的说明是:“Calling this method preloads buffers and acquires the audio hardware needed
for playback, which minimizes the lag between calling the
play
method and the start of sound
output.”。也就是说调用这个方法可以让硬件等提前准备好,能够缩短调用play方法播放到实际声音出来之间的时间。

如果想要跳转到某个时刻播放,可以使用currentTime属性:
[_audioPlayer setCurrentTime:current];
但是currentTime是NSTimeInterval类型,如果你想我想播放中间或说3/4位置,怎么办?

还有一个属性duration,是整个音频播放的总时长,如果想播放某个比例位置,就用这个比例乘以duration得到时长,然后用这个时长设置currentTime就可一条跳转过去了。

还有一些属性:

playing 是否正在播放

volume 音量,可用值区间为[0,1]

pan 调节左右声道相对大小。区间为[-1,1],越小左声道声音越大,右声道越小;越大则相反。

rate 播放速度,假设正常速度为rate,可调节区间为:[rate/2,2*rate];不过调节之前要先把enableRate设为YES;

然后是委托delegate和一些关于音频信息的属性。

***AudioPlay可以说就是iOS本身封装好的一个音频播放器,我们需要做简单播放的时候,就丢给它一个音频文件给它播放就可以了。都是封装越高级,操作越简单,同时也越没有什么能够插手的。

demo的github地址:AudioExample
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: