一、Audio Toolbox 1.使用代碼 import AudioServicesPlaySystemSound(1106); 2.如果想用自己的音頻文件創建系統聲音來播放的同學可以參考如下代碼。 //Get the filename of the sound file: NSString pa ...
一、Audio Toolbox
1.使用代碼
#import <AudioToolbox/AudioToolbox.h>
AudioServicesPlaySystemSound(1106);
2.如果想用自己的音頻文件創建系統聲音來播放的同學可以參考如下代碼。
//Get the filename of the sound file:
NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], @"/jad0007a.wav"];
// declare a system sound
id SystemSoundID soundID;
//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);
3.系統提示音對應的列表
AudioServices - iPhone Development Wiki(http://iphonedevwiki.net/index.php/AudioServices)
二、AVAudioPlayer
1.聲音播放
#import <AVFoundation/AVFoundation.h>
NSURL* url = [[NSBundlemainBundle] URLForResource:@"five"withExtension:@"mp3"];
AVAudioPlayer* audioPlay = [[AVAudioPlayeralloc] initWithContentsOfURL:url error:nil];
[audioPlay play];
三、AVAudiosession
AVAudiosession是AVFoundation框架提供的一個單例類,可以用來為我們的APP設置一個合適的音頻環境。通過對他進行配置,我們可以為自己的音樂播放APP設置合適的特征。
1.category屬性,預設值是AVAudioSessionCategorySoloAmbient
Category | 說明 | 場景 | 輸入 | 輸出 | 混合 | 遵從靜音 |
---|---|---|---|---|---|---|
AVAudioSessionCategoryAmbient | 背景音效 | NO | YES | YES | YES | |
AVAudioSessionCategoryPlayback | 音樂播放器 | NO | YES | NO | NO | |
AVAudioSessionCategoryOptionMixWithOthers | ||||||
AVAudioSessionCategorySoloAmbient | NO | YES | NO | YES | ||
AVAudioSessionCategoryRecord | YES | NO | NO | NO | ||
AVAudioSessionCategoryPlayAndRecord | YES | YES | NO | NO | ||
AVAudioSessionCategoryAudioProcessing | 使用硬體解碼器處理音頻,該音頻會話使用期間,不能播放或錄音 | |||||
AVAudioSessionCategoryMultiRoute | YES | YES | NO | NO | ||
2.靜音狀態下播放
[[AVAudioSession sharedInstance] setActive:YES
error:nil];
四、音頻中斷
手機上不止我們一款APP,在聽歌的時候,如果有人給我們打電話;或者之前定的一個鬧鐘到時間了;或者使用了siri功能。這些會使用手機音頻的應用,就會跟我們的APP音頻起衝突。稱作音頻中斷。
iOS系統的音頻服務優先順序高於第三方APP。當有電話進入、系統鬧鐘響起,都會導致第三方APP的audiosession中斷。
有兩種方式來處理這種中斷
1.通過註冊觀察者來獲取AVAudioSessionInterruptionNotification
事件的通知來響應中斷的開始和結束。
2.設置AVAudioSession代理
//設置代理 可以處理電話打進時中斷音樂播放
[[AVAudioSession sharedInstance] setDelegate:self];
五、遠程式控制制
1.iOS7.1之後
Media Player framework 加入了MPRemoteCommandCenter這個類。使用block類實現遠程式控制制回調。
要讓APP支持RemoteControl,我們需要用到MPRemoteCommandCenter單例類。它提供了處理 remote control events所需要的對象。它的屬性中包括了眾多MPRemoteCommand類對象,代表著iOS所支持的不同類型的remote control evnt。為MPRemoteCommand對象添加target和action來響應其控制事件。
2.iOS7.1之前
需要在UIApplication中實現remoteControlReceivedWithEvent來處理。
六、鎖屏界面顯示歌曲信息
為了在鎖屏界面和控制中心顯示當前歌曲的信息,需要用到Media Player Framework
的MPNowPlayingInfoCenter
類。把需要顯示的信息組織成Dictionary並賦值給nowPlayingInfo
屬性就完成了。
一些常見的屬性值如下:
// MPMediaItemPropertyAlbumTitle 專輯標題
// MPMediaItemPropertyAlbumTrackCount 聲道個數
// MPMediaItemPropertyAlbumTrackNumber 左右聲道
// MPMediaItemPropertyArtist 藝術家(歌曲作者)
// MPMediaItemPropertyArtwork 鎖屏界面的封面
// MPMediaItemPropertyComposer
// MPMediaItemPropertyDiscCount
// MPMediaItemPropertyDiscNumber
// MPMediaItemPropertyGenre
// MPMediaItemPropertyPersistentID
// MPMediaItemPropertyPlaybackDuration 播放時長
// MPMediaItemPropertyTitle
除了上面的Item Property,還有一些播放信息的屬性值,Playing Info Property,其中需要特別註意的是MPNowPlayingInfoPropertyPlaybackRate
和MPNowPlayingInfoPropertyElapsedPlaybackTime
。前者表示播放速率,後者表示已播放時間,即上圖中進度條左邊的時間。當設置了這兩個值,並且當前正在播放,就會自動地根據前一個時間和播放速率來計算。
在iOS11之前,當歌曲暫停時,其實該值還是在增加。為了保證該值的精確,需要在暫停和重新開始播放時,重新設置MPNowPlayingInfoPropertyPlaybackRate的值。
特別在iOS 11時,我們需要指定playbackState
的值,當不是MPNowPlayingPlaybackStatePlaying
時,並不會在鎖屏界面顯示當前播放信息。
參考1:http://www.samirchen.com/ios-avaudiosession-3/
參考2:http://msching.github.io/blog/2014/11/06/audio-in-ios-8/