iOS 关于音频开发
来源:互联网 发布:淘宝待付款取消订单 编辑:程序博客网 时间:2024/05/29 02:46
音频方面的知识,相对其他编程还是较为复杂的,特别是要搞清楚框架里具体使用的参数和方法,不然写起代码来非常迷茫.
1:播放简短性质的音频,例如按键声音,等可以这样实现.
一:引入框架:
- #import
二:先声明一个声音源ID
- SystemSoundID
_bookSoundID;
三:提供需要播放的音频地址进行声音源的注册.
- NSURL
*bookSoundUrl "bookSound"= [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@ ofType:@ "wav"]]; - AudioServicesCreateSyste
mSoundID((__bridge CFURLRef)bookSoundUrl, &_bookSoundID);
四:在需要的时候播放:
- AudioServicesPlaySystemS
ound(_bookSoundID);
五:不用的声音源记得释放掉
- AudioServicesDisposeSyst
emSoundID(_bookSoundID);
2:关于
首先知道 AVAudioSession
一:首先是设置
AVAudioSessionCategoryAm
AVAudioSessionCategorySo
AVAudioSessionCategoryPl
AVAudioSessionCategoryRe
AVAudioSessionCategoryPl
根据实际的使用情况来设定具体的类别,设置代码如下:
- AVAudioSession
* //得到AVAudioSession单例对象audioSession = [AVAudioSession sharedInstance]; - [audioSession
setDelegate:self];//设定代理 - [audioSession
setCategory:AVAudioSessionCategoryPl ayAndRecord error: &error];//设置类别,表示该应用同时支持播放和录音 - [audioSession
setActive:YES error: &error];//启动音频会话管理,此时会阻断后台音乐的播放.
- [[AVAudioSession
sharedInstance] setActive:NO error: nil];
三:通过音频会话可以强制的设置应用程序使用指定的输出方式,例如:内声道,扬声器,代码如下:
- UInt32
audioRouteOverride = hasHeadset ?kAudioSessionOverrideAud ioRoute_None:kAudioSessionOverrideAud ioRoute_Speaker; - AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,
sizeof(audioRouteOverride), &audioRouteOverride);
kAudioSessionOverrideAud
kAudioSessionOverrideAud
四:那么怎么判断用户是否已经插入耳机?代码如下:(参考:http://iandworld.sinaapp.com/?p=184001)
- -
(BOOL)hasHeadset { - //模拟器不支持
- #if
TARGET_IPHONE_SIMULATOR -
#warning *** Simulator mode: audio session code works only on a device -
return NO; - #else
-
CFStringRef route; -
UInt32 propertySize = sizeof(CFStringRef); -
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route); -
-
if((route == NULL) || (CFStringGetLength(route) == 0)){ -
// Silent Mode -
NSLog(@"AudioRoute: SILENT, );do nothing!" -
} else { -
NSString* routeStr = (__bridge NSString*)route; -
NSLog(@"AudioRoute: %@" ,routeStr); -
-
-
-
NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"]; -
NSRange headsetRange = [routeStr rangeOfString : @"Headset"]; -
if (headphoneRange.location != NSNotFound) { -
return YES; -
} else if(headsetRange.location != NSNotFound) { -
return YES; -
} -
} -
return NO; - #endif
-
- }
返回YES,表示已经插入耳机,返回NO表示没有插入耳机
五:监听用户拔出插入耳机事件
1:注册监听事件,和回调函数
- AudioSessionAddPropertyL
istener (kAudioSessionProperty_AudioRouteChange, -
audioRouteChangeListener Callback, -
self);
- void
audioRouteChangeListener Callback ( -
void *inUserData, -
AudioSessionPropertyID inPropertyID, -
UInt32 inPropertyValueSize, -
const void *inPropertyValue -
) { -
-
if (inPropertyID return;!= kAudioSessionProperty_AudioRouteChange) -
// Determines the reason for the route change, to ensure that it is not -
// because of a category change. -
CFDictionaryRef routeChangeDictionary = inPropertyValue; -
-
CFNumberRef routeChangeReasonRef = -
CFDictionaryGetValue (routeChangeDictionary, -
CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); -
-
SInt32 routeChangeReason; -
-
CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); -
NSLog(@" ===================================== ,RouteChangeReason : %d" routeChangeReason); -
AudioHelper *_self = (AudioHelper *) inUserData; -
if (routeChangeReason == kAudioSessionRouteChange Reason_OldDeviceUnavailable) { -
[_self resetSettings]; -
if (![_self hasHeadset]) { -
[[NSNotificationCenter defaultCenter] postNotificationName:@"ununpluggingHeadse" -
object:nil]; -
} -
} else if (routeChangeReason == kAudioSessionRouteChange Reason_NewDeviceAvailable) { -
[_self resetSettings]; -
if (![_self hasMicphone]) { -
[[NSNotificationCenter defaultCenter] postNotificationName:@"pluggInMicrophone" -
object:nil]; -
} -
} else if (routeChangeReason == kAudioSessionRouteChange Reason_NoSuitableRouteForCatego ry) { -
[_self resetSettings]; -
[[NSNotificationCenter defaultCenter] postNotificationName:@"lostMicroPhone" -
object:nil]; -
} -
//else if (routeChangeReason == kAudioSessionRouteChange Reason_CategoryChange ) { -
// [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPl ayAndRecord error:nil]; -
//} -
-
[_self printCurrentCategory]; - }
六:如何保持后台音乐的一直播放呢?(参考:http://blog.csdn.net/yhawaii/article/details/7788340)
1:在Info.plist中,添加"Required backgroundmodes"键,其值设置如下图所示:
2:系统音频服务支持音频播放,并关闭其他正在播放的音频
- AVAudioSession
*session = [AVAudioSession sharedInstance]; - [session
setActive:YES error:nil]; - [session
setCategory:AVAudioSessionCategoryPl ayback error:nil];
- [[UIApplication
sharedApplication] beginReceivingRemoteCont rolEvents];
4:执行
七 关于音量
1:由应用主动获取系统音量
- UInt32
dataSize sizeof(float);= - AudioSessionGetProperty
(kAudioSessionProperty_CurrentHardwareOutputVol ume, -
&dataSize, -
&keyVolume);
获取之前要确保
- AVAudioSession
*session = [AVAudioSession sharedInstance]; - [session
setActive:YES error:nil]; - [session
setCategory:AVAudioSessionCategoryPl ayback error:nil];
2:由应用主动设置系统音量 (参考:http://blog.csdn.net/studyrecord/article/details/6452354)
请参考:AudioStreamer
https://github.com/mattgallagher/AudioStreamer
如果你只是想简简单单在线播放以下不做任何处理. 那使用AVPlayer 等等去实现在线播放,也是可以的,但是如果要实现更多更能,还是别折腾这玩意,浪费生命.
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 关于音频开发
- iOS 音频开发之CoreAudio
- iOS音频开发功能
- IOS音频开发
- IOS 音频开发
- iOS音频开发功能
- iOS开发>>>音频播放
- iOS音频开发功能
- IOS音频开发总结
- IOS开发 音频播放
- 帅哥养成记录(转节选 获益…
- 定9周项目3稀疏矩阵的三元组表示的实现及应用
- 比较ZigBee各版本规范(1)
- IOS 公司开发者账号申请详细教程
- Android 读取权限管理
- iOS 关于音频开发
- iOS程序完成后如何生成ipa进行真机…
- HomeKit 开发指南(中文版)
- 不通过AppStore,在iOS设备上直接安…
- mac工具-解析json
- js 改变div 背景图片
- navigationBar导航条和navig…
- 适合动感单车的音乐,全套音…
- php中常见数组函数