zoukankan      html  css  js  c++  java
  • AVAudioPlayer音频播放器-备用

            IOS中有三种播放音频的方式:AVAudioPlayer、音频服务、音频队列。

           此文主要讲AVAudioPlayer,其他两个请见相关文章。

    AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。

    AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL并不可以是网络url而必须是本地文件URL,因为       AVAudioPlayer不具备播放网络音频的能力,不过我们可以用过一点小手段使其具备这个能力,留待稍后讲解。

            一个AVAudioPlayer只能播放一个音频,如果你想混音你可以创建多个AVAudioPlayer实例,每个相当于混音板上的一个轨道。

    一、创建一个播放器

     
    1. #import <AVFoundation/AVFoundation.h>     
    2. NSError* err;  
    3. AVAudioPlayer* player = [[AVAudioPlayer alloc]  
    4.                         initWithContentsOfURL:[NSURL fileURLWithPath:  
    5.                                               [[NSBundle mainBundle]pathForResource:  
    6.                                            @"music" ofType:@"m4a"   
    7.                                            inDirectory:@"/"]]  
    8.                         error:&err ];//使用本地URL创建  
    1. AVAudioPlayer* player = [[AVAudioPlayer alloc]  
    2.                             initWithData:myData   
    3.                             error:&err ];//使用NSData创建  

            我之前讲过AVAudioPlayer不可以播放网络URL,但是可以播放NSData,我们似乎受到了点启发,我们可以通过网络URL去创建NSData,然后在通过AVAudioPlayer来播放NSData,这样是不是就可以播放网络音乐了呢?但是此法并不可取,因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?所以播放网络音频我们一般用音频队列。

    二、播放器属性

            创建一个AVAudioPlayer以后你就可以对它的各种属性进行访问或设置了 。

    1.音量

    1. player.volume=0.8;//0.0~1.0之间  
    2.循环次数
    1. player.numberOfLoops = 3;//默认只播放一次  
    3.播放位置
    1. player.currentTime = 15.0;//可以指定从任意位置开始播放  
    4.声道数
    1. NSUInteger channels = player.numberOfChannels;//只读属性  
    5.持续时间
    1. NSTimeInterval duration = player.dueration;//获取采样的持续时间  

    6.仪表计数

    1. player.meteringEnabled = YES;//开启仪表计数功能  
    2. [ player updateMeters];//更新仪表读数  
    3. //读取每个声道的平均电平和峰值电平,代表每个声道的分贝数,范围在-100~0之间。  
    4. for(int i = 0; i<player.numberOfChannels;i++){  
    5. float power = [player averagePowerForChannel:i];  
    6. float peak = [player peakPowerForChannel:i];  
    7. }  

    三、播放声音

            准备了这么久,终于可以播放了,心情激动啊。

    1. [ player prepareToPlay];//分配播放所需的资源,并将其加入内部播放队列  
    2. [player play];//播放  
    3. [player stop];//停止  

             是否觉得准备了这么久,一下子就结束掉了,太快了,不用急,还有几个重点。

    四、代理方法

              加入播放出现异常,或者被更高级别的系统任务打断,我们的程序还没来得及收场就挂了,怎么办?不急,我们可以通过几个委托方法很好地处理所有的情形。

             首先给player设置委托是必须的:

    1. player.delegate = self;  
    1. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{  
    2.     //播放结束时执行的动作  
    3. }  
    4. - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{  
    5.     //解码错误执行的动作  
    6. }  
    7. - (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{  
    8.     //处理中断的代码  
    9. }  
    10. - (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{  
    11.     //处理中断结束的代码  
    12. }  

               了解了这些,你可以尝试着做一个本地播放器。

    最后贴上一个Demo:MusicPlayer

     
  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/isItOk/p/5215471.html
Copyright © 2011-2022 走看看