AVFoundation(一) 音频播放 AVAudioPlayer

话说也好久不写技术文章了, 最近单位在做这个音视频方面的app, 我将尽可能详细的由浅入深把这一块整理整理和大家分享给一下.


AVAudioPlayer

音频播放是很多应用中的常见需求, 音频播放用的最多的就是AVFoundation为我们提供的AVAudioPlayer, AVAudioPlayer提供了非常方便且简单的方法来实现音频播放. 可以是内存或本地中的音频文件,还有我们常用的音频循环, 甚至还提供音频计量,并且是非常友好的Obj-C接口.
AVAudioPlayer支持的音频格式为:AAC、MP3、ALAC等.
当然AVAudioPlayer也有缺点,那就是只能播放本地的音频.

创建AVAudioPlayer

AVAudioPlayer创建有两种方式:

  • 是一种是基于内存的NSData
        NSError *error;
        NSData *audioData = // 获取音频data
        // 创建AVAudioPlayer实例
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:audioData error:&error];
        // 错误判断
        if (error) {
            NSLog(@"%@", error);// 在这里我们做了简单的打印,在实际的项目中我们应该做出相应处理
        }
  • 另一种是本地文件的NSURL
        NSError *error;
        // 获取音频文件URL
        NSURL *url = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"];
        // 创建AVAudioPlayer实例
        AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        // 错误判断
        if (error) {
            NSLog(@"%@", error);// 在这里我们做了简单的打印,在实际的项目中我们应该做出相应处理
        }

AVAudioPlayer播放的控制

  • 播放 : 实例直接调用 play 方法就可以实现开始播放, 苹果推荐在调用play之前先调用prepareToPlay方法, 此方法会在播放之前预处理和预加载音频文件, 以减少播放延迟, 如果不调用此方法也可以正常播放,prepareToPlay方法也会隐式调用,但是会有些许延迟.
  • 停止: 实例调用pausestop都会停止当前播放, 再调用play 也都会继续播放音频, 但是stop方法会撤销prepareToPlay 方法中做的一些准备工作.
  • 进度控制: currentTime属性,改属性控制着播放进度, 如果音频正在播放,音频将偏移到指定的进度, 如果音频没在播放状态, currentTime决定着开始播放的进度.
  • 循环次数: numberOfLoops属性决定着音频的重复播放次数,默认值是0, 意味着只会播放一遍, 如果值我们设置为1, 那么会播放2遍, 以此类推,如果我们设置为一个负数, 那么将一直重复播放,直到我们手动停止.
  • 音量控制:volume属性, 赋值范围是从0.0-1.0, float类型数据.
  • 速度控制:rate属性是控制音频播放速率, 赋值范围0.5-2.0之间. 1.0为正常, 0.5为半速播放, 2.0为2倍速播放. 在使用rate属性之前,应先设置enableRate属性为YES 激活rate,并且必须在prepareToPlay之前调用.

AVAudioPlayerDelegate

// 将在播放完成后触发,如果顺利播放完成flag为YES, 如果返回NO意味着解码失败.
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;

// 解码失败会触发此方法
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error;

// 发生中断时会触发此方法(比如打进了电话)
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player;

// 下面三个为中断结束时触发此方法,苹果推荐最后一个方法
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags;
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withFlags:(NSUInteger)flags;
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player ;

写在最后

以后呢,我会定期更新有关AVFoundation的文章,如果有技术性错误,或文笔不妥之处,欢迎大家不吝赐教,或有什么开发中的问题都可以探讨学习.顺便说下, 下一篇文章将围绕音频录制为题展开研究.

喜欢的话给打个心心,成为我更新文章的动力哈.

你可能感兴趣的:(AVFoundation(一) 音频播放 AVAudioPlayer)