iOS 简单实现音频的播放

     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、一般音频播放:AVAudioPlayer

 AVAudioPlayer也是通过资源文件的地址构建,然后调用播放方法,系统自动播放。没有对于声音属性的,例如音轨、频率之类的调控,但可以控制播放的过程,也可以获取音频的信息,适合对声音没有很细致要求的播放,而且简单易用。

 首先,使用音频文件地址构建:

NSURL * musicURL = [[NSURL alloc]initFileURLWithPath:musicPath];
_audioPlayer = [[AVAudioPlayer 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和一些关于音频信息的属性。

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


demo的github地址:AudioExample

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值