iOS 关于音频开发

转载 2015年07月11日 08:39:19

音频方面的知识,相对其他编程还是较为复杂的,特别是要搞清楚框架里具体使用的参数和方法,不然写起代码来非常迷茫.

1:播放简短性质的音频,例如按键声音,等可以这样实现.

一:引入框架:

[csharp] view plaincopy
  1. #import <AudioToolbox/AudioToolbox.h>  

二:先声明一个声音源ID

[csharp] view plaincopy
  1. SystemSoundID _bookSoundID;  

三:提供需要播放的音频地址进行声音源的注册.

[csharp] view plaincopy
  1. NSURL *bookSoundUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"bookSound" ofType:@"wav"]];  
  2. AudioServicesCreateSystemSoundID((__bridge CFURLRef)bookSoundUrl, &_bookSoundID);  

四:在需要的时候播放:

[csharp] view plaincopy
  1. AudioServicesPlaySystemSound(_bookSoundID);  

五:不用的声音源记得释放掉

[csharp] view plaincopy
  1. AudioServicesDisposeSystemSoundID(_bookSoundID);  

2: 关于 AVAudioSession 的使用

首先知道 AVAudioSession  是一个单例模式,也就是说,不用开发者自行实例化. 这个类在各种音频环境中起着非常重要的作用

一:首先是设置 AVAudioSession 的 类别

                                                                                      获取输入硬 件          获取输出硬件       与IPOD混合      遵从振铃/静音按键
AVAudioSessionCategoryAmbient                            否                               是                          是                         是

AVAudioSessionCategorySoloAmbient                    否                              是                           否                         是

AVAudioSessionCategoryPlayback                          否                               是                           否                        否

AVAudioSessionCategoryRecord                              是                              否                           否                         否

AVAudioSessionCategoryPlayAndRecord              是                              是                           否                         否

根据实际的使用情况来设定具体的类别,设置代码如下:

[csharp] view plaincopy
  1. AVAudioSession * audioSession = [AVAudioSession sharedInstance]; //得到AVAudioSession单例对象  
  2. [audioSession setDelegate:self];//设定代理  
  3. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];//设置类别,表示该应用同时支持播放和录音  
  4. [audioSession setActive:YES error: &error];//启动音频会话管理,此时会阻断后台音乐的播放.  


二:在录制完声音或者播放完声音后,可以将音频会话关闭,来延续后台音乐的播放,代码如下:

[csharp] view plaincopy
  1. [[AVAudioSession sharedInstance] setActive:NO error: nil];  

三:通过音频会话可以强制的设置应用程序使用指定的输出方式,例如:内声道,扬声器,代码如下:

[csharp] view plaincopy
  1. UInt32 audioRouteOverride = hasHeadset ?kAudioSessionOverrideAudioRoute_None:kAudioSessionOverrideAudioRoute_Speaker;  
  2. AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);  

kAudioSessionOverrideAudioRoute_None  内声道,耳机

kAudioSessionOverrideAudioRoute_Speaker 扬声器

四:那么怎么判断用户是否已经插入耳机?代码如下: (参考:http://iandworld.sinaapp.com/?p=184001)

[csharp] view plaincopy
  1. - (BOOL)hasHeadset {  
  2. //模拟器不支持  
  3. #if TARGET_IPHONE_SIMULATOR  
  4.     #warning *** Simulator mode: audio session code works only on a device  
  5.     return NO;  
  6. #else  
  7.     CFStringRef route;  
  8.     UInt32 propertySize = sizeof(CFStringRef);  
  9.     AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route);  
  10.       
  11.     if((route == NULL) || (CFStringGetLength(route) == 0)){  
  12.         // Silent Mode  
  13.         NSLog(@"AudioRoute: SILENT, do nothing!");  
  14.     } else {  
  15.         NSString* routeStr = (__bridge NSString*)route;  
  16.         NSLog(@"AudioRoute: %@", routeStr);  
  17.           
  18.         /* Known values of route: 
  19.          * "Headset" 
  20.          * "Headphone" 
  21.          * "Speaker" 
  22.          * "SpeakerAndMicrophone" 
  23.          * "HeadphonesAndMicrophone" 
  24.          * "HeadsetInOut" 
  25.          * "ReceiverAndMicrophone" 
  26.          * "Lineout" 
  27.          */  
  28.           
  29.         NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"];  
  30.         NSRange headsetRange = [routeStr rangeOfString : @"Headset"];  
  31.         if (headphoneRange.location != NSNotFound) {  
  32.             return YES;  
  33.         } else if(headsetRange.location != NSNotFound) {  
  34.             return YES;  
  35.         }  
  36.     }  
  37.     return NO;  
  38. #endif  
  39.       
  40. }  

返回YES,表示已经插入耳机,返回NO表示没有插入耳机

五:监听用户拔出插入耳机事件

1:注册监听事件,和回调函数

[csharp] view plaincopy
  1. AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange,  
  2.                                      audioRouteChangeListenerCallback,  
  3.                                      self);  
2:实现回调函数进行相关处理:

[csharp] view plaincopy
  1. void audioRouteChangeListenerCallback (  
  2.                                        void                      *inUserData,  
  3.                                        AudioSessionPropertyID    inPropertyID,  
  4.                                        UInt32                    inPropertyValueSize,  
  5.                                        const void                *inPropertyValue  
  6.                                        ) {  
  7.   
  8.     if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;  
  9.     // Determines the reason for the route change, to ensure that it is not  
  10.     //      because of a category change.  
  11.     CFDictionaryRef routeChangeDictionary = inPropertyValue;  
  12.   
  13.     CFNumberRef routeChangeReasonRef =  
  14.     CFDictionaryGetValue (routeChangeDictionary,  
  15.                           CFSTR (kAudioSession_AudioRouteChangeKey_Reason));  
  16.   
  17.     SInt32 routeChangeReason;  
  18.   
  19.     CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason);  
  20.     NSLog(@" ===================================== RouteChangeReason : %d", routeChangeReason);  
  21.     AudioHelper *_self = (AudioHelper *) inUserData;  
  22.     if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {  
  23.         [_self resetSettings];  
  24.         if (![_self hasHeadset]) {  
  25.             [[NSNotificationCenter defaultCenter] postNotificationName:@"ununpluggingHeadse"  
  26.                                                                 object:nil];  
  27.         }  
  28.     } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) {  
  29.         [_self resetSettings];  
  30.         if (![_self hasMicphone]) {  
  31.             [[NSNotificationCenter defaultCenter] postNotificationName:@"pluggInMicrophone"  
  32.                                                                 object:nil];  
  33.         }  
  34.     } else if (routeChangeReason == kAudioSessionRouteChangeReason_NoSuitableRouteForCategory) {  
  35.         [_self resetSettings];  
  36.         [[NSNotificationCenter defaultCenter] postNotificationName:@"lostMicroPhone"  
  37.                                                             object:nil];  
  38.     }  
  39.     //else if (routeChangeReason == kAudioSessionRouteChangeReason_CategoryChange  ) {  
  40.     //    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  
  41.     //}  
  42.   
  43.     [_self printCurrentCategory];  
  44. }  

六:如何保持后台音乐的一直播放呢? (参考:http://blog.csdn.net/yhawaii/article/details/7788340)


1:在Info.plist中,添加"Required background modes"键,其值设置如下图所示:


2:系统音频服务支持音频播放,并关闭其他正在播放的音频

[csharp] view plaincopy
  1. AVAudioSession *session = [AVAudioSession sharedInstance];  
  2. [session setActive:YES error:nil];  
  3. [session setCategory:AVAudioSessionCategoryPlayback error:nil];  
3:设置app支持接受远程控制事件代码:
[csharp] view plaincopy
  1. [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];  
设置app支持接受远程控制事件,其实就是在dock中可以显示应用程序图标,同时点击该图片时,打开app,如下图所示:

4:执行 AVAudioPlayer  

七 关于音量

1:由应用主动获取系统音量

[csharp] view plaincopy
  1. UInt32 dataSize = sizeof(float);  
  2. AudioSessionGetProperty (kAudioSessionProperty_CurrentHardwareOutputVolume,  
  3.                                            &dataSize,  
  4.                                            &keyVolume);  

获取之前要确保

[csharp] view plaincopy
  1. AVAudioSession *session = [AVAudioSession sharedInstance];  
  2. [session setActive:YES error:nil];  
  3. [session setCategory:AVAudioSessionCategoryPlayback error:nil];  


2:由应用主动设置系统音量 (参考:http://blog.csdn.net/studyrecord/article/details/6452354)


八:关于音频边下载边播放的实现.

请参考:AudioStreamer

https://github.com/mattgallagher/AudioStreamer

如果你只是想简简单单在线播放以下不做任何处理. 那使用AVPlayer 等等 去实现在线播放,也是可以的,但是如果要实现更多更能,还是别折腾这玩意,浪费生命. 


iOS 音频开发经验汇总

http://blog.csdn.net/work4blue/article/details/47841317 一.音乐播放类概念 iOS 下能支持歌曲和声音播放的的类有几个: ...
  • jeffasd
  • jeffasd
  • 2016年12月19日 15:18
  • 904

iOS 关于音频开发

音频方面的知识,相对其他编程还是较为复杂的,特别是要搞清楚框架里具体使用的参数和方法,不然写起代码来非常迷茫. 1:播放简短性质的音频,例如按键声音,等可以这样实现. 一:引入框架: [...
  • daiyelang
  • daiyelang
  • 2013年11月27日 15:16
  • 5227

iOS开发————几种音频播放方式

这篇同样是编者对自己学习的小总结以及对iOS初级开发者的小福利,大神莫吐槽... 首先来谈谈AVFoundation框架:它是iOS中用于处理基于时间的媒体数据的高级框架,也是基于Core Audi...
  • Lerryteng
  • Lerryteng
  • 2016年04月21日 20:05
  • 6146

iOS音频开发(录音+播放+剪辑+合成+压缩转码)

iOS音频开发(录音+播放+剪辑+合成+压缩转码)
  • feng2qing
  • feng2qing
  • 2017年03月28日 21:52
  • 4346

iOS开发之音轨合成(音频与音频,音频与视频)

今天和大家一起分享关于音轨合成的坑(套路!全TM是套路!走一步套一路) 理论部分: 我们需要用到AVURLAsset来初始化文件,然后用AVMutableComposition和AVMutable...
  • zhonggaorong
  • zhonggaorong
  • 2016年07月22日 16:44
  • 5185

[IOS 开发] iOS音频篇:使用AVPlayer播放网络音乐

假如你现在打算做一个类似百度音乐、豆瓣电台的在线音乐类APP,你会怎样做? 首先了解一下音频播放的实现级别: 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行...
  • u010130947
  • u010130947
  • 2016年03月24日 10:29
  • 3006

iOS 播放音频的几种方法

iPhone OS主要提供以下了几种播放音频的方法: System Sound Services AVAudioPlayer 类 Audio Queue Services OpenAL...
  • Joycecsdn
  • Joycecsdn
  • 2016年05月11日 17:52
  • 4116

iOS开发之 AVAudioPlayer音频播放

1、相关知识点 播放音频可以使用框架 AVFoundation.framework 音效的播放 //1.获得音效文件的路径 NSURL*url= [[NSBundlemainBundle] URL...
  • sunnyboy9
  • sunnyboy9
  • 2016年04月30日 14:35
  • 2909

iOS音频文件拼接+裁剪(音频文件拼接做了性能优化)

==============================.h文件 #import @interface AudioPieceTogether : NSObject // 1...
  • u010309384
  • u010309384
  • 2015年12月02日 13:14
  • 3396

Ios 实现麦克风捕获和AAC编码

在Ios中,实现打开和捕获麦克风大多是用的AVCaptureSession这个组件来实现的,它可以不仅可以实现音频捕获,还可以实现视频的捕获。本文将主要实现麦克风音频的捕获和编码。 针对打开麦克风和...
  • shenyi0106
  • shenyi0106
  • 2015年07月22日 15:22
  • 5510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 关于音频开发
举报原因:
原因补充:

(最多只允许输入30个字)