服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南

iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南

2021-01-20 16:14刘伟 IOS

这里我们要介绍的是AVAudio ToolBox框架中的AudioServicesPlaySystemSound函数创建的服务,特别适合用来制作铃声,下面就简单整理一下iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南:

AudioServicesPlaySystemSound音频服务
对于简单的、无混音音频,AVAudio ToolBox框架提供了一个简单的C语言风格的音频服务。你可以使用AudioservicesPlaySystemSound函数来播放简单的声音。要遵守以下几个规则:
1.音频长度小于30秒
2.格式只能是PCM或者IMA4
3.文件必须被存储为.caf、.aif、或者.wav格式
4.简单音频不能从内存播放,而只能是磁盘文件
除了对简单音频的限制外,你对于音频播放的方式也基本无法控制。一旦音频播放就会立即开始,而且是当前电话使用者设置的音量播放。你将无法循环播放声音,也无法控制立体声效果。不过你还是可以设置一个回调函数,在音频播放结束时被调用,这样你就可以对音频对象做清理工作,以及通知你的程序播放结束。
直接上代码:

复制代码 代码如下:

#import <AudioToolbox/AudioToolbox.h> 
#import <CoreFoundation/CoreFoundation.h> 
//当音频播放完毕会调用这个函数 
static void SoundFinished(SystemSoundID soundID,void* sample){ 
    /*播放全部结束,因此释放所有资源 */ 
    AudioServicesDisposeSystemSoundID(sample); 
    CFRelease(sample); 
    CFRunLoopStop(CFRunLoopGetCurrent()); 

//主循环 
int main(){ 
    /*系统音频ID,用来注册我们将要播放的声音*/ 
    SystemSoundID soundID; 
    NSURL* sample = [[NSURL alloc]initWithString:@"sample.wav"]; 
     
    OSStatus err = AudioServicesCreateSystemSoundID(sample, &soundID); 
    if (err) { 
        NSLog(@"Error occurred assigning system sound!"); 
        return -1; 
    } 
    /*添加音频结束时的回调*/ 
    AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, SoundFinished,sample); 
    /*开始播放*/ 
    AudioServicesPlaySystemSound(soundID); 
    CFRunLoopRun(); 
    return 0; 


个人觉得这个音频服务有点鸡肋,不过它肯定有它的用武之地,比如我们要播放一个自定义的警告音或者消息提示,用音频服务肯定比其他的方法节省资源。

 

AVAudioPlayer音频播放器
IOS中有三种播放音频的方式:AVAudioPlayer、音频服务、音频队列。
AVAudioPlayer在AVFoundation框架下,所以我们要导入AVFoundation.framework。
AVAudioPlayer类封装了播放单个声音的能力。播放器可以用NSURL或者NSData来初始化,要注意的是NSURL并不可以是网络url而必须是本地文件URL,因为       AVAudioPlayer不具备播放网络音频的能力,不过我们可以用过一点小手段使其具备这个能力,留待稍后讲解。
一个AVAudioPlayer只能播放一个音频,如果你想混音你可以创建多个AVAudioPlayer实例,每个相当于混音板上的一个轨道。
一、创建一个播放器

复制代码 代码如下:

#import <AVFoundation/AVFoundation.h>    
NSError* err; 
AVAudioPlayer* player = [[AVAudioPlayer alloc] 
                        initWithContentsOfURL:[NSURL fileURLWithPath: 
                                              [[NSBundle mainBundle]pathForResource: 
                                           @"music" ofType:@"m4a"  
                                           inDirectory:@"/"]] 
                        error:&err ];//使用本地URL创建 

 

复制代码 代码如下:

AVAudioPlayer* player = [[AVAudioPlayer alloc] 
                            initWithData:myData  
                            error:&err ];//使用NSData创建 

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

复制代码 代码如下:

player.volume=0.8;//0.0~1.0之间 


2.循环次数

复制代码 代码如下:

player.numberOfLoops = 3;//默认只播放一次 


3.播放位置

复制代码 代码如下:

player.currentTime = 15.0;//可以指定从任意位置开始播放 


4.声道数

复制代码 代码如下:

NSUInteger channels = player.numberOfChannels;//只读属性


5.持续时间

复制代码 代码如下:

NSTimeInterval duration = player.dueration;//获取采样的持续时间


6.仪表计数

复制代码 代码如下:

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


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

复制代码 代码如下:

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


是否觉得准备了这么久,一下子就结束掉了,太快了,不用急,还有几个重点。
四、代理方法
加入播放出现异常,或者被更高级别的系统任务打断,我们的程序还没来得及收场就挂了,怎么办?不急,我们可以通过几个委托方法很好地处理所有的情形。
首先给player设置委托是必须的:

复制代码 代码如下:

player.delegate = self; 

 

复制代码 代码如下:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player successfully:(BOOL)flag{ 
    //播放结束时执行的动作 

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer*)player error:(NSError *)error{ 
    //解码错误执行的动作 

- (void)audioPlayerBeginInteruption:(AVAudioPlayer*)player{ 
    //处理中断的代码 

- (void)audioPlayerEndInteruption:(AVAudioPlayer*)player{ 
    //处理中断结束的代码 


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

延伸 · 阅读

精彩推荐
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5282021-01-16
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOS详解iOS中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10