1. 程式人生 > >iOS 音訊播放 —— AVAudioSession

iOS 音訊播放 —— AVAudioSession

An audio session is a singleton object that you employ to set the audio context for your app and to express to the system your intentions for your app’s audio behavior.

上面是摘自官方文件的介紹。大體就是說明一下 AVAudioSession 是一個單例物件,並用來為音訊類app向系統傳遞一些配置資訊。 其實在iOS7以前甚至是現在為止還有相當一部人使用的是AudioToolBox框架下的AudioSession,不過AudioSession

在SDK7中已經被蘋果標明* depracated*。所以我們主要就以AVAudioSession為主,與時俱進嘛!

AVAudioSession 的主要功能包括以下幾點功能:

  • 向系統說明你的app使用音訊的模式(比如是播放還是錄音,是否支援藍芽播放,是否支援後臺播放)
  • 為你的app選擇音訊的輸入輸出裝置(比如輸入用的麥克風,輸出是耳機、手機功放或者airplay)
  • 協助管理多個音源需要播放時的行為(例如同時使用多個音樂播放app,或者突然有電話接入)

下面就開始 AVAudioSession相關功能的使用,大家可以用我們上一篇寫好的 ——離線歌曲播放的例子來進行演練。

啟用音訊會話

細心的朋友可能已經發現我們上一篇寫好的音訊播放有很大的侷限性,比如:不支援後臺播放、當手機處於禁音狀態時也無法正常輸出聲音。這個時候就需要我們去啟用音訊會話,也就是 AVAudioSession

。啟用的方法非常簡單大家可以在初始化播放器的時候加上下面一段程式碼

//啟用音訊會話
[[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
[[AVAudioSession sharedInstance]setActive:YES error:nil];

這段程式碼的意思呢就是設定我們app音訊會話的category(模式)和option(選項),下面這張表就是幾種可選的category

及其效果,大家在實際開發中可以根據自己的實際情況去選擇對應的引數:

會話型別說明是否要求輸入是否要求輸出是否遵從靜音鍵
AVAudioSessionCategoryAmbient混音播放,可以與其他音訊應用同時播放
AVAudioSessionCategorySoloAmbient獨佔播放
AVAudioSessionCategoryPlayback後臺播放,獨佔
AVAudioSessionCategoryRecord錄音模式
AVAudioSessionCategoryPlayAndRecord播放和錄音,此時可以錄音也可以播放
AVAudioSessionCategoryAudioProcessing硬體解碼音訊,此時不能播放和錄製
AVAudioSessionCategoryMultiRoute多種輸入輸出,例如可以耳機、USB裝置同時播放

啟用音訊會話後,我們就可以開始執行一系列跟 AVAudioSession 的服務了。

後臺播放及遠端控制

可以這麼說,不支援後臺播放的音訊類app是不完整的,但是要我們的app支援後臺播放外,還需要給我們的專案設定一些引數。
網上很多教程都是教的直接修改plist檔案,我這裡也放出來這種方法:在info.plist 檔案中加入如下引數Required background modes並在item 0中寫入App plays audio or streams audio/video using AirPlay。如下圖

在plist中註冊後臺播放

但是Xcode其實在很早的版本就已經提供了圖形化的操作介面,更為的直觀,不知大家是沒有發現還是什麼原因,相關的一些配置都是直接修改的plist,下面就是圖形化的設定方法。如圖

圖形化操作介面註冊後臺播放

好了,這個時候重新執行我們的程式home到後臺後,我們的播放器就不會暫停播放了。不過這個時候我們撥出系統的控制檯發現我們播放的歌曲並沒有在這顯示,這是因為我們呢沒有告訴系統我們的app接受遠端控制,下面讓我們的播放器響應遠端。

首先要在初始化播放器的時候或者是appDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;這個方法中加入這段程式碼

//告訴系統,我們要接受遠端控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];

如果你的app是以音訊播放為主,我建議你的程式碼是寫在appDelegate中。重寫appDelegatecanBecomeFirstResponder方法讓我們的appDelegate可以成為第一響應者,已響應控制檯的操作。

- (BOOL)canBecomeFirstResponder{
    return YES;
}

最後只要再實現一下- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent;這個方法,我們app的遠端控制功能就完成了。

//響應遠端音樂播放控制訊息
- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {
    if (receivedEvent.type == UIEventTypeRemoteControl) {
        switch (receivedEvent.subtype) {
            case UIEventSubtypeRemoteControlPlay:
                [self.playCenter midBtnClicked:nil];
                NSLog(@"暫停播放");
                break;
            case UIEventSubtypeRemoteControlPause:
                [self.playCenter midBtnClicked:nil];
                NSLog(@"繼續播放");
                break;
            case UIEventSubtypeRemoteControlNextTrack:
                NSLog(@"下一曲");
                break;
            case UIEventSubtypeRemoteControlPreviousTrack:
                NSLog(@"上一曲");
                break;
            default:
                break;
        }
    }
}

這裡我只是簡單的舉例了其中幾個常用的列舉值,更詳細遠端控制會在後續完善。

差點忘記,在控制檯中也是可以看到正在播放的歌曲的哦,不過如果你沒有配置的話,那就只會顯示你app的名字了,程式碼如下

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:@{MPMediaItemPropertyTitle:self.detailModel.sampleAudioTitle,MPMediaItemPropertyAlbumTitle:self.detailModel.sampleAuther}];

監聽RouteChange事件

監聽RouteChange事件,我們一般是為了實現 拔出耳機後暫停播放 這個功能。

//首先向NSNotificationCenter新增通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];

-(void)routeChange:(NSNotification *)notification實現如下:

/**
 *  一旦輸出改變則執行此方法
 *
 *  @param notification 輸出改變通知物件
 */
-(void)routeChange:(NSNotification *)notification{
    NSDictionary *dic=notification.userInfo;
    int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue];
    //等於AVAudioSessionRouteChangeReasonOldDeviceUnavailable表示舊輸出不可用
    if (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
        AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey];
        AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject];
        //原裝置為耳機則暫停
        if ([portDescription.portType isEqualToString:@"Headphones"]) {
           if (self.playButton.selected) {
              [self playButtonAction:_playButton];
           }
        }
    }
}

一般來說如果沒有實現 拔出耳機後暫停播放 ,系統會自動的把預設輸出裝置設定為揚聲器。但是有一個例外,就是當AVAudioSessionCategory 設定為 AVAudioSessionCategoryPlayAndRecord 的時候,音訊輸出的預設裝置是聽筒而不是揚聲器。這個時候如果你既不希望播放器自動暫停播放,又希望切換到揚聲器播放的時候,你可能需要做如下處理,一樣是在方法 -(void)routeChange:(NSNotification *)notification; 中實現

NSError *error = nil;
AVAudioSession *session = [AVAudioSession sharedInstance];   
//強制設定為揚聲器播放
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

相關推薦

iOS 音訊播放 —— AVAudioSession

An audio session is a singleton object that you employ to set the audio context for your app and to express to the system your intentions for your app’s au

IOS 音訊播放

例項:1.新建Empty Application專案,新增HomeViewController頁面  HomeViewController.h程式碼如下: #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @

iOS音訊播放 (六):簡單的音訊播放器實現

在前幾篇中我分別講到了AudioSession、AudioFileStream、AudioFile、AudioQueue,這些類的功能已經涵蓋了第一篇中所提到的音訊播放所需要的步驟: 讀取MP3檔案 NSFileHandle解析取樣率、位元速率、時長等資訊,分離MP3中的音訊幀 AudioFileStr

iOS音訊播放之AVAudioPlayer,AVPlayer,AVQueuePlayer

前言 在婚語APP中,分別使用了AVAudioPlayer,AVPlayer,AVQueuePlayer來實現音訊播放功能,下面以婚語的實際需求分別介紹它們的使用方法和區別。 需求1 檔期備忘:使用者新建檔期記錄時,可以進行錄音備忘,錄音完成後可直接播放,儲存檔期時將錄音檔案上傳

iOS 音訊開發AVAudioPlayer的使用,音效播放AudioServicesPlaySystemSound使用

音訊開發AVAudioPlayer的使用 AVAudioPlayer是iOS系統自帶的可以播放本地mp3檔案的一個類,(注意:只能播放本地) 參考:http://www.jianshu.com/p/589999e53461 1,先匯入庫AVFoundation/AVFoundati

IOS自動播放音訊/視訊

ios 為了節省使用者流量,對於 audio 和 video標籤的 preload 和 autopaly 標籤會自動攔截,除非使用者手動點選互動才會執行 。 對於背景音樂,又必須載入的時候就要執行,解決方法:(不過注意只能在微信瀏覽器裡面開啟) document

iOS開發之建立音訊播放的單例類

因為涉及到專案的開發,所以這裡只把PlayerCenter單例類中的程式碼進行展示,僅做參考,其中包含上一曲,暫停/播放,下一曲等功能,專案中也涉及到了後臺播放和操作的功能,具體的使用大家可以繼續研究,或者給我留言,等有空寫一個Demo給大家分享PlayCenter.h#im

iOS開發————幾種音訊播放方式

這篇同樣是編者對自己學習的小總結以及對iOS初級開發者的小福利,大神莫吐槽... 首先來談談AVFoundation框架:它是iOS中用於處理基於時間的媒體資料的高階框架,也是基於Core Audio,Core Media,Core Video等框架構建的,充分利用了多核硬

音訊播放的實現以及後臺播放音訊 iOS

1、首先,音訊播放的實現,我這裡使用的是AVPlayer。 AVAudioPlayer只能播放本地資源。當然還有別的播放方法這裡就不列舉了。 以下程式碼實現的是如下圖所示的效果,點選圖示可以暫停或者繼續播放: 需要的屬性: // @propert

iOS 實現播放本地音訊

#import <AudioToolbox/AudioToolbox.h>/** * 播放音效檔案 * * @param name 音訊檔名稱 */ -(void)playSoundE

IOS音訊1:之採用四種方式播放音訊檔案(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE

在本卷你可以學到什麼? 採用四種方法設計應用於各種場合的音訊播放器: 基於AudioToolbox.framework框架。播放系統聲音檔案。 基於AVFoundation.framework框架。播放多種音訊格式檔案。具有高階音訊播放器功能。如實時顯示進度、功率,控制音量

AVAudioSession-Category與語音喚醒和音訊播放的恩怨糾葛

最近,在開發一款音樂播放器型別專案中遇到的一些與AVAudioSession-Category設定的一些坑,以下是整個過程的一些經驗總結。 1.常規播放 一般如果應用只有簡單音樂播放功能,那麼我們的AVAudioSession-Category只用像如下一樣設定即可:

iOS 視訊音訊播放器 檔案管理的實現

本人根據自己所學做了一款免費的播放器悅覽播放器,包含以下功能: - 視訊播放 - 音訊播放 - 檔案管理 - WiFi傳輸 - 格式轉換 - 面對面檔案傳輸 - 後臺音訊播放和控制 - 二維碼掃描和生成

iOS開發-進階:音訊播放、錄音、視訊播放、拍照、視訊錄製

轉自: http://www.cnblogs.com/kenshincui/p/4186022.html#audioRecord 文章太長了, 如果我這裡寫的質量不好, 請參考原文; 概覽 隨著移動網際網路的發展,如今的手機早已不是打電話、發簡訊那麼

iOS開發之 AVAudioPlayer音訊播放

// // ViewController.m #import "ViewController.h" #import "AudioTool.h" #import <AVFoundation/AVFoundation.h> @interface ViewController () /** 播放

iOS 音訊錄製、播放(本地、網路)

文章目錄 一、錄音機(AVAudioRecorder) 1、簡介 2、如何使用 3、具體實現(開始、暫停、停止、播放 四個功能) 4、附件實現demo 二、播放音訊 1、播放本地音訊檔案(AVAudioPl

AVAudioPlayer音訊播放器—IOS開發

 IOS中有三種播放音訊的方式:AVAudioPlayer、音訊服務、音訊佇列。        此文主要講AVAudioPlayer,其他兩個請見相關文章。 AVAudioPlayer在AVFoundation框架下,所以我們要匯入AVFoundation.frame

關於iOS網路音訊播放的一些詳解(使用AVPlayer播放網路音訊)

在日常的iOS開發中,我們通常會遇到媒體播放的問題,XCode中已經為我們提供了功能非常強大的AVFoundation框架和MediaPlayer框架.其中AVFoundation框架中的AVAudioPlayer主要

IOS AVAudioPlay 播放本地音訊沒聲音問題

self.avAudioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:bellVoicePath] error:&bellVoiceError];

iOS AVAudioPlayer和AVAudioPlayerDelegate-音訊播放處理中斷

學習總是在進行。 一、AVAudioPlayer如何處理中斷 AVAudioPlayer類提供了代理方法,用來處理當播放音訊檔案時,發生來電、鬧鐘等事件。設定代理並遵守AVAudioPlayerDelegate協議,<span style="font-family: