AVFoundation框架 (二) 音頻播放

播放和錄制音頻

學(xué)習使用AVAudioPlayer和AVAudioRecorder類的實現(xiàn)音頻播放和錄制功能.

1. iOS的音頻環(huán)境

當你在iPhone上聽音樂時,音頻從內(nèi)置??中播放出來,此時有電話撥入,音樂會立即暫停,轉(zhuǎn)而聽到手機鈴聲. 當你掛掉電話, 音樂又將恢復(fù). 這都是程序通過 audio session 來管理和音頻硬件的交互來實現(xiàn)的. 所有的應(yīng)用程序都有音頻會話, 無論你是否使用.默認音頻會話有很多合適的預(yù)配置,例如,手機設(shè)置靜音則所有應(yīng)用的音頻都會出于靜音狀態(tài).
在大部分應(yīng)用程序中,使用默認的即可,如果你有特殊要求, 使用AVAudioSession對應(yīng)的分類來配置.

  • 音頻會話分類
分類 作用 是否允許跟其他應(yīng)用混音 支持音頻輸入 支持音頻輸出
AVAudioSessionCategoryAmbient 一般app應(yīng)用 ?? ??
...SoloAmbient (默認) 一般app應(yīng)用 ??
...Playback 音頻播放器 可選 ??
...Record 錄音機,音頻捕捉 ??
...PlayAndRecord VoIp,語音聊天 可選 ?? ??
...AudioProcessing 離線會話和處理(僅需要用到編解碼處理功能的)
...MultiRoute 使用外設(shè)硬件的應(yīng)用 ?? ??

其中一些分類可以使用option和modes進行進一步配置.

  • 音頻會話的配置: audio session 在應(yīng)用程序的整個生命周期是可以修改的,通常只需要在應(yīng)用啟動時配置一次.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    AVAudioSession *session = [AVAudioSession sharedInstance];
    NSError *error;
    if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) { // 選擇音頻會話類型
        NSLog(@"Category Error: %@", [error localizedDescription]);
    }
    if (![session setActive:YES error:&error]) { // 開啟音頻會話
        NSLog(@"Activation Error: %@", [error localizedDescription]);
    }
    return YES;
}
2. 使用AVAudioPlayer 播放音頻

AVAudioPlayer類提供了從基本的文本或內(nèi)存播放音頻的接口.以及對播發(fā)器音量的控制,Pan值(左右聲道,立體聲), 播放速率, 音頻循環(huán), 音頻計量(用于提供可視化).audio session選用合適的分類配置完成后,我們就可以使用AVAudioPlayer了.

//導(dǎo)入AVFoundation框架.
  //1. 為聲音文件創(chuàng)建AVAudioPlayer實例
  NSURL *fileURL = [[NSBundle mainBundle] URLForResource:name
                                             withExtension:@"caf"];
  NSError *error;
  AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
                                                                   error:&error];
// 2. 配置
   if (!player) {
    NSLog(@"Error creating player: %@", [error localizedDescription]);
    return ;
   }
    player.numberOfLoops = -1; // 循環(huán)次數(shù).
    player.enableRate = YES; // 允許設(shè)置播放速率
    [player prepareToPlay];  
// 3. 控制部分.
// 開始 [player play]; 
// 暫停 [player pause];
// 停止 [player stop]; 
// 調(diào)整速率 player.rate = xx;
// 調(diào)整音量 player.volume = xx;
// 調(diào)整聲道 player.pan = xx;

如果要應(yīng)用后臺播放不僅要設(shè)置合適的音頻會話分類, 還需要在info.plist中配置Required background modes.

2.1 音頻事件處理.
  • 系統(tǒng)中斷事件:例如,電話,鬧鐘等. 這類事件發(fā)生時,系統(tǒng)會自動中斷應(yīng)用的音頻并在結(jié)束后繼續(xù). 如果有額外需求(例如更新UI)可監(jiān)聽AVAudioSessionInterruptionNotification通知,它的info信息中AVAudioSessionInterruptionType確定音頻中斷類型并做相應(yīng)處理.
  • 線路改變事件:例如插拔耳機,斷開USB麥克風等音頻輸入或輸出線路變化.通過監(jiān)聽AVAudioSessionRouteChangeNotification額外處理(例如插拔耳機系統(tǒng)會自動變化輸出線路,但用戶拔出耳機時并不是想直接外音播放.),通過info信息中AVAudioSessionRouteChangeReason確定線路變化類型并做相應(yīng)處理.
3. 使用AVAudioRecorder錄制音頻.

通過AVAudioRecorder來從麥克風等音頻設(shè)備進行錄制.同樣的,程序啟動時先配置Audio Session分類; 之后創(chuàng)建AVAudioRecorder時需要提供一些額外信息:

  • 要寫入的本地文件URL
  • 用于配置錄音的NSDictionary對象.
  • 捕捉錯誤的NSError指針.
//導(dǎo)入AVFoundation框架.
  //1. 創(chuàng)建 AVAudioRecorder
        NSString *tmpDir = NSTemporaryDirectory();
        NSString *filePath = [tmpDir stringByAppendingPathComponent:@"memo.caf"];
        NSURL *fileURL = [NSURL fileURLWithPath:filePath];

        NSDictionary *settings = @{ // 這些配置根據(jù)錄制格式考慮質(zhì)量和文件大小的平衡來決定
                                   AVFormatIDKey : @(kAudioFormatAppleIMA4), // 錄制格式
                                   AVSampleRateKey : @44100.0f,  // 采樣率
                                   AVNumberOfChannelsKey : @1,  // 通道數(shù)
                                   AVEncoderBitDepthHintKey : @16, 位深
                                   AVEncoderAudioQualityKey : @(AVAudioQualityMedium)
                                   };
        NSError *error;
        self.recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:&error];
        if (!self.recorder) {
            NSLog(@"Error: %@", [error localizedDescription]);
            return;
        }
        self.recorder.delegate = self; // 監(jiān)聽錄制狀態(tài)
        self.recorder.meteringEnabled = YES;  
        [self.recorder prepareToRecord];
  
  //2 .錄制
        [ self.recorder record];

meteringEnabled 開啟音頻計量,允許讀取音頻計量數(shù)值,在錄制時就可以讓用戶聲音大小可視化.

// 讀取平均分貝
    float avgPower = [self.recorder averagePowerForChannel:0];
//  讀取峰值分貝
    float peakPower = [self.recorder peakPowerForChannel:0];
// 數(shù)據(jù)進行合適處理后使用Quartz或OpenGL ES繪制.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蜜唾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庶艾,更是在濱河造成了極大的恐慌,老刑警劉巖擎勘,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咱揍,死亡現(xiàn)場離奇詭異,居然都是意外死亡棚饵,警方通過查閱死者的電腦和手機煤裙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪漾,“玉大人硼砰,你說我怎么就攤上這事⌒琅穑” “怎么了题翰?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诈胜。 經(jīng)常有香客問我豹障,道長,這世上最難降的妖魔是什么焦匈? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任血公,我火速辦了婚禮,結(jié)果婚禮上缓熟,老公的妹妹穿的比我還像新娘累魔。我一直安慰自己,他們只是感情好够滑,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布垦写。 她就那樣靜靜地躺著,像睡著了一般版述。 火紅的嫁衣襯著肌膚如雪梯澜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天渴析,我揣著相機與錄音晚伙,去河邊找鬼。 笑死俭茧,一個胖子當著我的面吹牛咆疗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播母债,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼午磁,長吁一口氣:“原來是場噩夢啊……” “哼尝抖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迅皇,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤昧辽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后登颓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搅荞,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年框咙,在試婚紗的時候發(fā)現(xiàn)自己被綠了咕痛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡喇嘱,死狀恐怖茉贡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情者铜,我是刑警寧澤腔丧,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站王暗,受9級特大地震影響悔据,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜俗壹,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一科汗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绷雏,春花似錦头滔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至期吓,卻和暖如春早歇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讨勤。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工箭跳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潭千。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓谱姓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刨晴。 傳聞我的和親對象是個殘疾皇子屉来,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容