話說也好久不寫技術文章了, 最近單位在做這個音視頻方面的app, 我將盡可能詳細的由淺入深把這一塊整理整理和大家分享給一下.
AVAudioPlayer
音頻播放是很多應用中的常見需求, 音頻播放用的最多的就是AVFoundation
為我們提供的AVAudioPlayer
, AVAudioPlayer
提供了非常方便且簡單的方法來實現音頻播放. 可以是內存或本地中的音頻文件,還有我們常用的音頻循環, 甚至還提供音頻計量,并且是非常友好的Obj-C接口.
AVAudioPlayer支持的音頻格式為:AAC、MP3、ALAC等.
當然AVAudioPlayer也有缺點,那就是只能播放本地的音頻.
創建AVAudioPlayer
AVAudioPlayer創建有兩種方式:
- 是一種是基于內存的
NSData
NSError *error;
NSData *audioData = // 獲取音頻data
// 創建AVAudioPlayer實例
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:audioData error:&error];
// 錯誤判斷
if (error) {
NSLog(@"%@", error);// 在這里我們做了簡單的打印,在實際的項目中我們應該做出相應處理
}
- 另一種是本地文件的
NSURL
NSError *error;
// 獲取音頻文件URL
NSURL *url = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"];
// 創建AVAudioPlayer實例
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
// 錯誤判斷
if (error) {
NSLog(@"%@", error);// 在這里我們做了簡單的打印,在實際的項目中我們應該做出相應處理
}
AVAudioPlayer播放的控制
- 播放 : 實例直接調用
play
方法就可以實現開始播放, 蘋果推薦在調用play
之前先調用prepareToPlay
方法, 此方法會在播放之前預處理和預加載音頻文件, 以減少播放延遲, 如果不調用此方法也可以正常播放,prepareToPlay
方法也會隱式調用,但是會有些許延遲. - 停止: 實例調用
pause
和stop
都會停止當前播放, 再調用play
也都會繼續播放音頻, 但是stop
方法會撤銷prepareToPlay
方法中做的一些準備工作. - 進度控制:
currentTime
屬性,改屬性控制著播放進度, 如果音頻正在播放,音頻將偏移到指定的進度, 如果音頻沒在播放狀態,currentTime
決定著開始播放的進度. - 循環次數:
numberOfLoops
屬性決定著音頻的重復播放次數,默認值是0, 意味著只會播放一遍, 如果值我們設置為1, 那么會播放2遍, 以此類推,如果我們設置為一個負數, 那么將一直重復播放,直到我們手動停止. - 音量控制:
volume
屬性, 賦值范圍是從0.0-1.0, float類型數據. - 速度控制:
rate
屬性是控制音頻播放速率, 賦值范圍0.5-2.0之間. 1.0為正常, 0.5為半速播放, 2.0為2倍速播放. 在使用rate
屬性之前,應先設置enableRate
屬性為YES 激活rate
,并且必須在prepareToPlay
之前調用.
AVAudioPlayerDelegate
// 將在播放完成后觸發,如果順利播放完成flag為YES, 如果返回NO意味著解碼失敗.
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag;
// 解碼失敗會觸發此方法
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error;
// 發生中斷時會觸發此方法(比如打進了電話)
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player;
// 下面三個為中斷結束時觸發此方法,蘋果推薦最后一個方法
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags;
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withFlags:(NSUInteger)flags;
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player ;
寫在最后
以后呢,我會定期更新有關AVFoundation的文章,如果有技術性錯誤,或文筆不妥之處,歡迎大家不吝賜教,或有什么開發中的問題都可以探討學習.順便說下, 下一篇文章將圍繞音頻錄制為題展開研究.
喜歡的話給打個心心,成為我更新文章的動力哈.