AVAudioPlayer

       AVAudioPlayer提供了一个简单的从文本或内存中播放音频的方法,它在Mac和iOS 11系统中经常被作为实现音频播放的最佳选择。

       AVAudioPlayer构建于Core Audio中的C-based Audio Queue Services的最顶层。所以他可以提供所有你在Audio Queue Services中所能找到的核心功能,比如播放、循环、甚至音频计量,但是使用的是非常友好的OC接口。除非你需要从网络流中播放音频、需要访问原始音频样本或者需要非常低的时延,否则AVAudioPlayer都能胜任。

1.配置音频会话 

        音频会话的周期是可以修改的 但通常我们只对其配置一次,就是在应用程序启动时。配置回话的最佳位置就在此方法内    

         AVAudioSession *session = [AVAudioSession sharedInstance];    

        NSError *error;   

        if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) { 

               NSLog(@"category error:%@",[error localizedDescription]);    

        }    

        if (![session setActive:YES error:&error]) { 

               NSLog(@"activation error:%@",[error localizedDescription]);    

        }

AVAudioSessionCategoryAmbient:使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音。

AVAudioSessionCategorySoloAmbient:使用这个category的应用会随着静音键和屏幕关闭而静音。不可以与其他声音混合播放,会中断其他声音。

AVAudioSessionCategoryPlayback:使用这个category的应用时,当手机设置为静音或进入后台时会继续播放,如果让使声音在后台继续播放时,必须在plist文件里面添加UIBackgroundModes属性。默认情况下,使用这一类别意味着你的应用程序的音频是不可混合激活的,你的会话将中断任何其他非混合的音频会话。

AVAudioSessionCategoryRecord:用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。如果让使声音在后台继续播放时,必须在plist文件里面添加UIBackgroundModes属性。

AVAudioSessionCategoryPlayAndRecord:允许播放或录制音频,两者不可同时进行,除此之外同AVAudioSessionCategoryPlayback类似。支持AirPlay 。但是如果设置AVAudioSessionModeVoiceChat属性, AirPlay是不可用的。

AVAudioSessionCategoryMultiRoute:支持音频播放和录制。允许多条音频流的同步输入和输出。比如:USB 和耳麦同时音频输出。

2.创建AVAudioPlayer

       NSURL *url = [[NSBundle mainBundle] URLForResource:@"rock" withExtension:@"mp3"];

        NSError *error = nil;

        self.player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];

        if (error == nil) {

            [self.player prepareToPlay];

        }

[self.player play];

- (BOOL)prepareToPlay : 会取得需要的音频文件并预加载Audio Queue的缓存区,降低调用play方法和听到声音输出之间的延时,在使用play方法时如果没有做好准备会自动调用该方法

注意事项:AVAudioPlayer一定要设置成全局变量,局部变量会被释放

- (BOOL)play : 立即播放音频

- (void)pause : 播放暂停

- (void)stop :停止播放行为

pausestop方法在应用程序外面看来实现的功能都是停止当前播放行为,下一时间我们调用play方法,通过pausestop方法停止音频会继续播放。这两者最主要的区别在底层处理上。调用stop方法会撤销prepareToPlay时所做的设置,而调用pause方法则不会。

@property float volume : 修改播放器的音量,播放器的音量独立于系统的音量,我们可以通过对播放器音量的处理实现很多有趣的效果,比如声音建银效果。(0.0-1.0)

@property float pan : 允许使用立体声播放声音:播放器的pan只有一个浮点表示,范围从-1.0(极左)到1.0(极右)。默认值为0.0(居中)

@property float rate :调整播放率,允许用户在不改变声调的情况下调整播放率(0.5-2.0)如果正记录一首复杂的音乐或语音,放慢速度会有很大的帮助;当我们想快速浏览一份政府常规会议内容时,加速播放就很有帮助。

@property NSInteger numberOfLoops :

- (BOOL)playAtTime:(NSTimeInterval)time :指定时间点,异步播放声音。

    延迟播放:

        NSTimeInterval playbackDelay = 3.0; // must be ≥ 0

        [myAudioPlayer playAtTime: myAudioPlayer.deviceCurrentTime + playbackDelay];

    使用这个方法可以同步播放两个及以上指定的音频,建议:

        NSTimeInterval shortStartDelay = 0.01; // seconds

        NSTimeInterval now = player.deviceCurrentTime;

        [player      playAtTime: now + shortStartDelay];

        [secondPlayer playAtTime: now + shortStartDelay];

3.处理中断事件

    我们要确保应用程序可以正确的处理中断事件。中断事件在 iOS 设备中经常出现,在使用设备的过程中经常会有诸如电话呼入、闹钟响起及弹出 FaceTime 请求的情况。虽然 iOS 本身可以很好地处理这些事件,不过我们还是确保我们自己针对这些情况地处理足够完美。

添加终端通知:

    NSNotificationCenter *nsnc = [NSNotificationCenter defaultCenter];

    [nsnc addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:nil];

在 handleInterruption:方法中,首先通过检索AVAudioSessionInterruptionTypeKey的值确定中断类型,AVAudioSessionInterruptionType 这是用于表示中断开始或结束的枚举类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容