注冊(cè) AVAudioSession.interruptionNotification 的通知,可以收到播放打斷通知。 系統(tǒng)將此通知發(fā)布到主線程。
成都創(chuàng)新互聯(lián)主營(yíng)榆林網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,榆林h5微信小程序開發(fā)搭建,榆林網(wǎng)站營(yíng)銷推廣歡迎榆林等地區(qū)企業(yè)咨詢
其中userinfo有如下字段:
分began與end,用來表示打斷開始與打斷結(jié)束。
只在打斷結(jié)束時(shí)返回。選項(xiàng)用 shouldResume 來指示:另一個(gè)音頻會(huì)話的中斷已結(jié)束,應(yīng)用程序可以恢復(fù)其音頻會(huì)話。
該屬性只在打斷開始時(shí)返回。存在于版本iOS 10.3-14.5。
用于確定這次中斷是否由于系統(tǒng)掛起App所致。
獲取到的是一個(gè)NSNumber表示的Bool。為true表示中斷是由于系統(tǒng)掛起,false是被另一音頻打斷。
該屬性只在打斷開始時(shí)返回。存在于版本iOS 14.5以后,用來代替 AVAudioSessionInterruptionWasSuspendedKey 。
default :因?yàn)榱硪粋€(gè)音頻會(huì)話被激活,音頻中斷。(例如后臺(tái)播著音頻,此時(shí)播放微信語音)
appWasSuspended :由于APP被系統(tǒng)掛起,音頻中斷
builtInMicMuted :音頻因內(nèi)置麥克風(fēng)靜音而中斷(例如iPad智能關(guān)閉套【iPad's Smart Folio】合上)
一、簡(jiǎn)單介紹
簡(jiǎn)單來說,音頻可以分為2種
(1)音效
又稱“短音頻”,通常在程序中的播放時(shí)長(zhǎng)為1~2秒
在應(yīng)用程序中起到點(diǎn)綴效果,提升整體用戶體驗(yàn)
(2)音樂
比如游戲中的“背景音樂”,一般播放時(shí)間較長(zhǎng)
框架:播放音頻需要用到AVFoundation.framework框架
二、音效的播放
1.獲得音效文件的路徑
復(fù)制代碼 代碼如下:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];
2.加載音效文件,得到對(duì)應(yīng)的音效ID
復(fù)制代碼 代碼如下:
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), soundID);
3.播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(soundID);
注意:音效文件只需要加載1次
4.音效播放常見函數(shù)總結(jié)
加載音效文件
復(fù)制代碼 代碼如下:
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)
釋放音效資源
復(fù)制代碼 代碼如下:
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)
播放音效
復(fù)制代碼 代碼如下:
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)
播放音效帶點(diǎn)震動(dòng)
復(fù)制代碼 代碼如下:
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
三、程序示例
先導(dǎo)入需要依賴的框架
導(dǎo)入需要播放的音效文件素材
說明:AVFoundation.framework框架中的東西轉(zhuǎn)換為CF需要使用橋接。
代碼示例:
復(fù)制代碼 代碼如下:
YYViewController.m文件
//
// YYViewController.m
// 14-音效播放
//
// Created by apple on 14-8-8.
// Copyright (c) 2014年 yangyong. All rights reserved.
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.獲得音效文件的全路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"buyao.wav" withExtension:nil];
//2.加載音效文件,創(chuàng)建音效ID(SoundID,一個(gè)ID對(duì)應(yīng)一個(gè)音效文件)
SystemSoundID soundID=0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, soundID);
//把需要銷毀的音效文件的ID傳遞給它既可銷毀
//AudioServicesDisposeSystemSoundID(soundID);
//3.播放音效文件
//下面的兩個(gè)函數(shù)都可以用來播放音效文件,第一個(gè)函數(shù)伴隨有震動(dòng)效果
AudioServicesPlayAlertSound(soundID);
//AudioServicesPlaySystemSound(#systemsoundid)
}
@end
說明:點(diǎn)擊屏幕可以播放音效文件。
音樂的播放
一、簡(jiǎn)單說明
音樂播放用到一個(gè)叫做AVAudioPlayer的`類,這個(gè)類可以用于播放手機(jī)本地的音樂文件。
注意:
(1)該類(AVAudioPlayer)只能用于播放本地音頻。
(2)時(shí)間比較短的(稱之為音效)使用AudioServicesCreateSystemSoundID來創(chuàng)建,而本地時(shí)間較長(zhǎng)(稱之為音樂)使用AVAudioPlayer類。
二、代碼示例
AVAudioPlayer類依賴于AVFoundation框架,因此使用該類必須先導(dǎo)入AVFoundation框架,并包含其頭文件(包含主頭文件即可)。
導(dǎo)入必要的,需要播放的音頻文件到項(xiàng)目中。
代碼示例:
復(fù)制代碼 代碼如下:
//
// YYViewController.m
// 15-播放音樂
//
#import "YYViewController.h"
#import
@interface YYViewController ()
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
AVAudioPlayer *audioPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[audioPlayer prepareToPlay];
//4.播放
[audioPlayer play];
}
@end
代碼說明:運(yùn)行程序,點(diǎn)擊模擬器界面,卻并沒有能夠播放音頻文件,原因是代碼中創(chuàng)建的AVAudioPlayer播放器是一個(gè)局部變量,應(yīng)該調(diào)整為全局屬性。
可將代碼調(diào)整如下,即可播放音頻:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *audioplayer;
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.audioplayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.audioplayer prepareToPlay];
//4.播放
[self.audioplayer play];
}
@end
注意:一個(gè)AVAudioPlayer只能播放一個(gè)url,如果想要播放多個(gè)文件,那么就得創(chuàng)建多個(gè)播放器。
三、相關(guān)說明
新建一個(gè)項(xiàng)目,在storyboard中放三個(gè)按鈕,分別用來控制音樂的播放、暫停和停止。
程序代碼如下:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
- (IBAction)play {
//開始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會(huì)出現(xiàn)一些莫名其面的問題
[self.player stop];
}
@end
注意:如果點(diǎn)了“停止”,那么一定要播放器重新創(chuàng)建,不然的話會(huì)出現(xiàn)莫名其妙的問題。
點(diǎn)擊了stop之后,播放器實(shí)際上就不能再繼續(xù)使用了,如果還繼續(xù)使用,那么后續(xù)的一些東西會(huì)無法控制。
推薦代碼:
復(fù)制代碼 代碼如下:
#import "YYViewController.h"
#import
@interface YYViewController ()
@property(nonatomic,strong)AVAudioPlayer *player;
- (IBAction)play;
- (IBAction)pause;
- (IBAction)stop;
@end
復(fù)制代碼 代碼如下:
@implementation YYViewController
#pragma mark-懶加載
-(AVAudioPlayer *)player
{
if (_player==Nil) {
//1.音頻文件的url路徑
NSURL *url=[[NSBundle mainBundle]URLForResource:@"235319.mp3" withExtension:Nil];
//2.創(chuàng)建播放器(注意:一個(gè)AVAudioPlayer只能播放一個(gè)url)
self.player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
//3.緩沖
[self.player prepareToPlay];
}
return _player;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)play {
//開始播放/繼續(xù)播放
[self.player play];
}
- (IBAction)pause {
//暫停
[self.player pause];
}
- (IBAction)stop {
//停止
//注意:如果點(diǎn)擊了stop,那么一定要讓播放器重新創(chuàng)建,否則會(huì)出現(xiàn)一些莫名其面的問題
[self.player stop];
self.player=Nil;
}
@end
四、播放多個(gè)文件
點(diǎn)擊,url,按住common建查看。
可以發(fā)現(xiàn),這個(gè)url是只讀的,因此只能通過initWithContentsOfUrl的方式進(jìn)行設(shè)置,也就意味著一個(gè)播放器對(duì)象只能播放一個(gè)音頻文件。
那么如何實(shí)現(xiàn)播放多個(gè)音頻文件呢?
可以考慮封裝一個(gè)播放音樂的工具類,下一篇文章將會(huì)介紹具體怎么實(shí)現(xiàn)。
任何吸引人的游戲都少不了聲音。iOS開發(fā)者在游戲中需要使用聲音時(shí)有多種選擇,取決于對(duì)游戲中音頻的控制需求,可以選擇簡(jiǎn)單的內(nèi)置服務(wù),也可以選擇更高級(jí)的API(比如OpenAL)。
通過音頻API,可以實(shí)現(xiàn)流式音頻,播放簡(jiǎn)短音效,甚至模擬3d空間的音頻。有些游戲可以通過音軌讓玩家沉浸在特定的心境中玩游戲,設(shè)置鼓勵(lì)用戶使用耳機(jī)來獲得更完美的體驗(yàn)。
本系列文章中,會(huì)陸續(xù)整理近幾年來在工作中涉及到的音頻的相關(guān)知識(shí),以算做對(duì)自己知識(shí)體系的一次梳理吧,大體包括Core Audio、OpenAL 以及Cocos2d引擎中的音效部分等三個(gè)方面。
? Core Audio 是什么?
? Core Audio 中提供的音頻服務(wù)
? Core Audio 中的有關(guān)音頻框架
? 有關(guān) Core Audio 的變化及更新
Core Audio 是什么?
Core Audio 是iOS和 MAC 的關(guān)于數(shù)字音頻處理的基礎(chǔ),它提供應(yīng)用程序用來處理音頻的一組軟件框架,所有關(guān)于IOS音頻開發(fā)的接口都是由Core Audio來提供或者經(jīng)過它提供的接口來進(jìn)行封裝的,按照官方的說法是集播放、音頻處理、錄制為一體的專業(yè)技術(shù),通過它我們的程序可以同時(shí)錄制,播放一個(gè)或者多個(gè)音頻流,自動(dòng)適應(yīng)耳機(jī),藍(lán)牙耳機(jī)等硬件,響應(yīng)各種電話中斷,靜音,震動(dòng)等,甚至提供3D效果的音樂播放。
相關(guān)鏈接:
Core Audio Overview
Audio Video Starting Point
Core Audio Glossary
Core Audio中提供的音頻服務(wù)
Core Audio 本身是一個(gè)很龐大的話題,涉及到多個(gè)領(lǐng)域中的不同服務(wù),為了更方便的使用Core Audio,通??梢詫⑵浞指顬楦〉哪K。圖一展示了根據(jù)應(yīng)用程序服務(wù)層分解的示意圖。構(gòu)建在應(yīng)用程序棧最下面的是底層硬件。接下來往上是驅(qū)動(dòng)程序?qū)?。?gòu)建在驅(qū)動(dòng)層之上的每一層都是蘋果提供給開發(fā)人員的應(yīng)用層服務(wù),包括各類音頻API和框架。
主要的幾類服務(wù):
Audio Unit
Audio Unit 是Core Audio 在應(yīng)用層中最底層的服務(wù)。在使用其他音頻API時(shí),最終在底層都會(huì)調(diào)用到Audio Unit。在所有的API中,Audio Unit 是延遲最短且最靈活的,但代價(jià)就是它的使用相當(dāng)?shù)膹?fù)雜,幸運(yùn)的是在實(shí)際使用中,我們很少直接使用Audio Unit。
相關(guān)鏈接:
Audio Unit Framework Reference
相關(guān)項(xiàng)目工程:
Core Audio Utility Classes
Audio File Service
通過Audio File Service 提供的API可以打開并讀取或者寫入磁盤上存儲(chǔ)的文件。
Audio File Stream Service
它是對(duì)Audio File Service 的擴(kuò)展補(bǔ)充。Audio File Service 對(duì)存儲(chǔ)到磁盤上的音頻文件進(jìn)行操作,而Audio File Stream Service
并不一定關(guān)聯(lián)到某個(gè)文件上,它更適合基于網(wǎng)絡(luò)的音頻應(yīng)用程序。
Audio Conversion Service
通過它可以將數(shù)據(jù)轉(zhuǎn)換為PCM格式或者從PCM格式轉(zhuǎn)換成數(shù)據(jù)。
Extended Audio File Service
可以將它理解為Audio File Service 和 Audio File Service 的組合。通過這種API 可以直接加在并轉(zhuǎn)換音頻文件。
Audio Session Service
和Core Audio中的其他API不同,它的主要用于 iOS 系統(tǒng)中協(xié)調(diào)應(yīng)用程序之間的音頻播放的 API 的。例如,當(dāng)有電話打進(jìn)來時(shí),音頻的播放就會(huì)被暫停;在用戶啟動(dòng)電影時(shí),音樂的播放就會(huì)停止。我們需要使用這些 API 來確保一個(gè)應(yīng)用程序能夠正確響應(yīng)并處理這類事件。
System Sound Service
它是一種允許播放短音效和警告的基本服務(wù),還具有提供振動(dòng)功能的獨(dú)特能力,Core Audio中的其他任何服務(wù)都不能訪問振動(dòng)系統(tǒng)。
Audio Queue Service
它可以對(duì)播放音頻進(jìn)行精細(xì)的控制,比如暫停、繼續(xù)、循環(huán)播放和音頻同步等,因此特別適合于播放和錄制持續(xù)時(shí)間很長(zhǎng)的音頻。在游戲中進(jìn)行語音敘述等情景時(shí),需要音樂或者長(zhǎng)時(shí)間的播放文件,便會(huì)需要它。
AVFoundation
它是Core Audio中唯一基于Objective-C的框架。這個(gè)框架提供了AVAudioPlayer類用于播放,AVAudioReconder類用于錄音,以及AVAudioSession類用于設(shè)置音頻回話。和其他高層API一樣,我們需要在易用性和功能之間做出權(quán)衡。如果在此框架中找不到我們需要的特性或者功能,那么就必須深入底層服務(wù)并直接使用底層的API。
相關(guān)鏈接:
AV Foundation Framework Reference
AV Foundation Programming Guide
Audio Session Programming Guide
相關(guān)的項(xiàng)目工程:
AVCaptureAudioDataOutput To AudioUnit iOS
OpenAL
和其他專用API不同,OpenAL是一個(gè)狂平臺(tái)的用于播放和捕捉音頻的工業(yè)標(biāo)準(zhǔn)。OpenAL更適合播放空間音頻(spatialized sound)或者定位音頻(positional sound)??梢詫⒖臻g音頻理解成3D空間中的聲音,通過OpanAL可以對(duì)音效添加一些效果,比如位置屬性,這樣會(huì)使遠(yuǎn)程的聲音比近處的聲音聽起來要弱一些。
相關(guān)鏈接:
OpenAL FAQ for iPhone OS
相關(guān)的項(xiàng)目工程:
oalTouch
Core Audio中的有關(guān)音頻框架
Core Audio 中的服務(wù)和框架并沒有一對(duì)一的對(duì)應(yīng)關(guān)系,應(yīng)用層的服務(wù)實(shí)際上分為5個(gè)不同的框架:Core Audio、Audio Toolbox、Audio Unit、AVFoundtaion、OpenAL。圖二中很好的展示了這些框架和服務(wù)之間的映射關(guān)系。
Audio Unit、AVFoundation和OpenAL的框架非常明了,和他們同名的服務(wù)直接對(duì)應(yīng),其中AVFoundtion有三個(gè)Objective-C類組成:AVAudioPlayer、AVAudioRecorder和AVAudioSession。
Audio Toolbox 框架提供了前面列出的其他剩下的應(yīng)用層服務(wù),包括非常重要的Audio Session Service。
相關(guān)鏈接:
Audio Toolbox Framework Reference
其他相關(guān)框架:
Media Player Framework
它是一個(gè)用于音頻和視頻播放的高層級(jí)接口,它包含了一個(gè)可以在應(yīng)用中直接使用的默認(rèn)的用戶界面,可以使用它來播放用戶在 iPod 庫中的項(xiàng)目,或者播放本地文件以及網(wǎng)絡(luò)流。另外,這個(gè)框架也包括了查找用戶媒體庫中內(nèi)容的 API,同時(shí)還可以配置像是在鎖屏界面或者控制中心里的音頻控件。
相關(guān)鏈接:
Media Player Framework Reference
Core MIDI Framework
提供與MIDI設(shè)備通訊的標(biāo)準(zhǔn)方式,包括硬件鍵盤和合成器??梢允褂眠@個(gè)框架來發(fā)送和接收MIDI消息以及與通過dock連接器或網(wǎng)絡(luò)連接到iOS設(shè)備的MIDI外設(shè)交互。
相關(guān)鏈接:
Core MIDI Framework Reference
OS 4.0以后的功能變化如下:
iOS 7.1
Support for External Media Players (CarPlay相關(guān)的)
iOS 7.0
新增 Inter-App Audio和 AudioCopy
強(qiáng)化 Media Player / AV Foundation Framework
棄用 Audio Toolbox framework內(nèi)的Audio Session API
iOS 6.0
新增 Audio UnitのComponent
強(qiáng)化 Media Player / Core Media / AV Foundation Framework
iOS 5.0
新增 Audio UnitのComponent
強(qiáng)化 Media Player / AV Foundation / AudioToolbox Frameworks
iOS 4.3
強(qiáng)化 AV Foundation
強(qiáng)化 Media Player / Audio Unit / Audio Toolbox Frameworks
iOS 4.2
新增 Core MIDI framework
強(qiáng)化 Media Player Framework
新增 AirPlay
iOS 4.1
強(qiáng)化 AV Foundation
iOS 4.0
新增 Core Media Framework
強(qiáng)化 AV Foundation
相關(guān)鏈接:What's New in iOS
名稱欄目:ios音頻開發(fā),ios音頻軟件
當(dāng)前鏈接:http://jinyejixie.com/article30/dsdjcso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、定制網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、App開發(fā)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)