AVAudioPlayer是AVFoundation.framework裡面最基本的一個音頻播放器的類。它與MPMediaPlayerController在一些基本操作功能上是類同的,比如play,pause,volume等等。
不一樣的地方在於AVAudioPlayer沒有隊列這個東西,也就是說它只能播放一個指定路徑的音頻。要播放多個音頻,可以通過創建多個AVAudioPlayer來實現。在AVFoundation裡面,有另外一個功能強大的類AVQueuePlayer,基本上要做音樂播放器要靠它,什麼QQ音樂,酷狗應該都是使用AVQueuePlayer。關於AVQueuePlayer的使用,將在之後的博文中講述。
那麼AVAudioPlayer有什麼用呢?
AVAudioPlayer能實現的功能類似於System Audio Services,播放單一音頻,但它不同的地方在於它可以控制播放的次數,播放的時間。比如用它可以很方便的實現重復播放。另外,它還有一個很強大的功能,就是可以很方便的調節左右聲道的音量,從而實現很酷的立體聲效果。從這個角度看,AVAudioPlayer很適用於游戲中的音頻播放。比如紙牌游戲中洗牌時就可以重復播放洗牌時的音頻直到洗牌結束。
下面開始介紹AVAudioPlayer的具體使用。
STEP 1:設置Audio Session
要記住,使用AVFoundation的東西播放音頻,肯定要先對Audio Session進行設置,除非你使用默認的設置。關於Audio Session的設置,詳見之前的博文。
下面是示例:
[plain]
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
STEP 2:初始化AVAudioPlayer
示例代碼:
[plain]
NSURL *musicOneURL = [[NSBundle mainBundle] URLForResource:@"十年" withExtension:@"mp3"];
self.audioPlayerOne = [[AVAudioPlayer alloc] initWithContentsOfURL:musicOneURL error:nil];
NSURL *musicOneURL = [[NSBundle mainBundle] URLForResource:@"十年" withExtension:@"mp3"];
self.audioPlayerOne = [[AVAudioPlayer alloc] initWithContentsOfURL:musicOneURL error:nil];
STEP 3:設置AVAudioPlayer
AVAudioPlayer有一個重要的property就是pan,用它可以來調節音頻播放時左右聲道的大小,如果值是-1.0為完全左聲道發生,如果是1.0則為完全右聲道發音。
另外,還有一個很強大的功能,就是可以測量音頻播放時實時聲道的功率大小,這個功能可以用於輔助顯示聲音的波浪,很多電腦上的播放器都有的。當然,如果用它來進行聲波的分析,我想也是可以的。
示例代碼:
[plain]
// audioPlayerOne 為一個AVAudioPlayer的對象
self.audioPlayerOne.meteringEnabled = YES; // 允許測量
[self.audioPlayerOne updateMeters]; // 更新數據
[self.averagePowerChannelOne setValue:[self.audioPlayerOne averagePowerForChannel:0] animated:YES]; // 將獲取的數據賦予相關的控件
[self.averagePowerChannelTwo setValue:[self.audioPlayerOne averagePowerForChannel:1] animated:YES];
// audioPlayerOne 為一個AVAudioPlayer的對象
self.audioPlayerOne.meteringEnabled = YES; // 允許測量
[self.audioPlayerOne updateMeters]; // 更新數據
[self.averagePowerChannelOne setValue:[self.audioPlayerOne averagePowerForChannel:0] animated:YES]; // 將獲取的數據賦予相關的控件
[self.averagePowerChannelTwo setValue:[self.audioPlayerOne averagePowerForChannel:1] animated:YES];
STEP 4:控制
示例代碼:
[plain]
[self.audioPlayerOne prepareToPlay]; // 准備數據,播放前必須設置
[self.audioPlayerOne setNumberOfLoops:-1]; // 設置為-1可以實現無限循環播放
[self.audioPlayerOne setRate:1.5f]; // 設置播放速度
[self.audioPlayerOne setPan:1.0f]; // 設置左右聲道
[self.audioPlayerOne setCurrentTime:20.0f]; // 設置播放時間
[self.audioPlayerOne play]; // 播放
[self.audioPlayerOne pause]; // 暫停
[self.audioPlayerOne stop]; // 停止
[self.audioPlayerOne prepareToPlay]; // 准備數據,播放前必須設置
[self.audioPlayerOne setNumberOfLoops:-1]; // 設置為-1可以實現無限循環播放
[self.audioPlayerOne setRate:1.5f]; // 設置播放速度
[self.audioPlayerOne setPan:1.0f]; // 設置左右聲道
[self.audioPlayerOne setCurrentTime:20.0f]; // 設置播放時間
[self.audioPlayerOne play]; // 播放
[self.audioPlayerOne pause]; // 暫停
[self.audioPlayerOne stop]; // 停止
STEP 5: Delegate
有時根據需要可以設置AVAudioPlayer的delegate,這樣在播放結束時可以進行一些相關的操作
示例代碼:
[plain]
// 完成播放
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag) {
NSLog(@"play succeed");
}
}
// 播放中斷結束後,比如突然來的電話造成的中斷
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
}
// 完成播放
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag) {
NSLog(@"play succeed");
}
}
// 播放中斷結束後,比如突然來的電話造成的中斷
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
}