AVFoundation-音樂(lè)播放

    音效和音樂(lè)? 其實(shí)并沒(méi)有嚴(yán)格意義上的限定,一般在開(kāi)發(fā)中,將時(shí)間比較短, 播放頻率比較高的, 當(dāng)做音效處理;
  1. 本地音樂(lè)播放:通過(guò)AVAudioPlayer實(shí)現(xiàn)澜共。AVAudioPlayer的父類(lèi)是NSObject
  2. 遠(yuǎn)程音樂(lè)播放:通過(guò)AVPlayer實(shí)現(xiàn)顽冶。AVPlayer的父類(lèi)是NSObject

播放本地音樂(lè)--使用AVAudioPlayer

  1. 導(dǎo)入AVFoundation框架

    #import <AVFoundation/AVFoundation.h>
    
  2. 使用AVAudioPlayer類(lèi), 進(jìn)行播放音頻

    // 1. 根據(jù)音頻文件URL, 創(chuàng)建AVAudioPlayer對(duì)象
        // 獲取資源URL
        NSURL *url = [[NSBundle mainBundle]  URLForResource:@"簡(jiǎn)單愛(ài).mp3" withExtension:nil];
        // 根據(jù)資源URL, 創(chuàng)建 AVAudioPlayer 對(duì)象
        _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    
    // 2. 準(zhǔn)備播放
        // 準(zhǔn)備播放
        [_audioPlayer prepareToPlay];
    
    // 3. 開(kāi)始播放
        [self.audioPlayer play];
    
  3. 附加設(shè)置

    // 暫停
        [self.audioPlayer pause];
    
    // 停止
        [self.audioPlayer stop]; // 停止某個(gè)音樂(lè), 下次再播放, 會(huì)從當(dāng)前位置開(kāi)始播放
        self.audioPlayer.currentTime = 0; // 重置當(dāng)前播放時(shí)間
    
    // 快進(jìn)
        // 系統(tǒng)已經(jīng)對(duì)currentTime, 做了容錯(cuò)處理, 不用擔(dān)心時(shí)間為負(fù)數(shù)或者大于音樂(lè)總時(shí)長(zhǎng)
        self.audioPlayer.currentTime += 5;
    
    // 倍速播放
        // 1.0 為正常
        // 設(shè)置允許調(diào)整播放速率, 注意, 此方法必須設(shè)置在準(zhǔn)備播放之前(經(jīng)測(cè)試, 在播放前也可以)
        self.audioPlayer = nil;
        self.audioPlayer.enableRate = YES;
        self.audioPlayer.rate = 2.0;
    
    // 音量調(diào)節(jié)
        // 0.0 --- 1.0
        self.audioPlayer.volume = slider.value;
    
    // 監(jiān)聽(tīng)播放事件
        // 1. 設(shè)置代理
        // 2. 實(shí)現(xiàn)代理方法
    
  4. 后臺(tái)播放

     1. 勾選后臺(tái)模式
     2. 激活音頻播放會(huì)話(huà)
     ** 注意: 模擬器測(cè)試不準(zhǔn)確, 以真機(jī)為準(zhǔn); **
     3. 實(shí)現(xiàn)代碼(在播放器play方法中實(shí)現(xiàn)下述代碼):
    
    // 1. 獲取音頻會(huì)話(huà)
    AVAudioSession *session = [AVAudioSession sharedInstance];
    // 2. 設(shè)置會(huì)話(huà)分類(lèi)
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    // 3. 激活會(huì)話(huà)
    [session setActive:YES error:nil];
    
  5. 音頻會(huì)話(huà)
    1. 在iOS中每個(gè)應(yīng)用都有一個(gè)音頻會(huì)話(huà),這個(gè)會(huì)話(huà)就通過(guò)AVAudioSession來(lái)表示。AVAudioSession同樣存在于AVFoundation框架中,它是單例模式設(shè)計(jì),通過(guò)sharedInstance進(jìn)行訪問(wèn)
    2. 音頻會(huì)話(huà)類(lèi)型簡(jiǎn)介
    1. AVAudioSessionCategoryAmbient 混音播放脑融,可以與其他音頻應(yīng)用同時(shí)播放
    2. AVAudioSessionCategorySoloAmbient 獨(dú)占播放
    3. AVAudioSessionCategoryPlayback 后臺(tái)播放喻频,也是獨(dú)占的
    4. AVAudioSessionCategoryRecord 錄音模式,用于錄音時(shí)使用
    5. AVAudioSessionCategoryPlayAndRecord 播放和錄音肘迎,此時(shí)可以錄音也可以播放
    6. AVAudioSessionCategoryAudioProcessing 硬件解碼音頻甥温,此時(shí)不能播放和錄制
    7. AVAudioSessionCategoryMultiRoute 多種輸入輸出,例如可以耳機(jī)妓布、USB設(shè)備同時(shí)播放

  6. swift實(shí)現(xiàn)音樂(lè)播放(包含后臺(tái)播放功能)

    import UIKit
    import AVFoundation
    
    class ViewController: UIViewController {
    
    func playBack() -> () {
    
        // 1. 獲取音頻會(huì)話(huà)
        let session = AVAudioSession.sharedInstance()
        do {
            // 2. 設(shè)置會(huì)話(huà)類(lèi)別
           try session.setCategory(AVAudioSessionCategoryPlayback)
    
             // 3. 激活會(huì)話(huà)
            try session.setActive(true)
        }catch {
            print(error)
            return
        }
    }
    
    lazy var player: AVAudioPlayer? = {
        // 1. 創(chuàng)建一個(gè)播放器
        guard let url = NSBundle.mainBundle().URLForResource("簡(jiǎn)單愛(ài).mp3", withExtension: nil) else {
            return nil
        }
    
        do {
            // 當(dāng)播放另外一首歌曲的時(shí)候, 需要重新創(chuàng)建對(duì)應(yīng)的播放器
            // 不能播放遠(yuǎn)程音頻, 只能播放本地音頻
            let player = try AVAudioPlayer(contentsOfURL: url)
    
            // 設(shè)置代理, 可以監(jiān)聽(tīng)播放器的一些事件
            player.delegate = self
    
            // 設(shè)置啟動(dòng)倍速播放功能, 一定要放到 prepareToPlay, 之前設(shè)置
             player.enableRate = true
    
            // 2. 準(zhǔn)備播放(系統(tǒng)會(huì)分配資源)
            player.prepareToPlay()
    
            return player
    
        }catch {
            print(error)
            return nil
        }
    }()
    }
    
    // MARK: - 播放功能
    extension ViewController {
        @IBAction func play() {
    
            // 3. 開(kāi)始播放
            player?.play()
    
            // 后臺(tái)播放, 兩個(gè)條件
            // 0. 勾選后臺(tái)模式
            // 1. 生成并激活會(huì)話(huà)對(duì)象
            playBack()
        }
    
        @IBAction func stop() {
    
            // 停止, 必須手動(dòng)清除, currentTime
            player?.currentTime = 0
            player?.stop()
        }
    
        @IBAction func pause() {
            player?.pause()
        }
    
        @IBAction func kuaijin() {
            // 內(nèi)部已經(jīng)做好了容錯(cuò)處理
            // 不會(huì)出現(xiàn)大于音頻最大時(shí)長(zhǎng), 或者, 小于0
            player?.currentTime += 15
        }
    
        @IBAction func kuaitui() {
            player?.currentTime -= 15
        }
    
        @IBAction func rate() {
            player?.rate = 5.0
        }
    
        @IBAction func volumn(slider: UISlider) {
            player?.volume = slider.value
        }
    }
    
    extension ViewController: AVAudioPlayerDelegate {
        func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) {
            print("播放完成")
        }
    }
    
  7. 使用須知

     > 每一個(gè)AVAudioPlayer對(duì)象對(duì)應(yīng)一個(gè)音頻播放, 如果想播放多個(gè)音頻, 就需要?jiǎng)?chuàng)建多個(gè)AVAudioPlayer;
     > 使用AVAudioPlayer類(lèi), 只能播放本地資源, 不能播放遠(yuǎn)程音樂(lè)
    
  8. 測(cè)試環(huán)境

     > 后臺(tái)播放,需要使用真機(jī)進(jìn)行測(cè)試, 模擬器不準(zhǔn)確
    

播放遠(yuǎn)程音樂(lè)--使用AVPlayer

  1. 方案一:
    // 1. 根據(jù)URL, 創(chuàng)建AVPlayer
        self.player = [[AVPlayer alloc] initWithURL:@"http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4"];
    // 2. 播放
        [self.player paly];
    
  2. 方案二:
    // 1. 根據(jù)AVPlayerItem, 創(chuàng)建AVPlayer
        NSURL *remoteURL = [NSURL URLWithString:@"http://cc.stream.qqmusic.qq.com/C100003j8IiV1X8Oaw.m4a?fromtag=52"];
        AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:remoteURL];
        self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
    
    // 2. 播放
        [self.player paly];
    
  3. 方案對(duì)比:
    1. 如果通過(guò)方案1播放某個(gè)遠(yuǎn)程音頻, 那么后面如果想要更改音樂(lè), 則需要重新創(chuàng)建AVPlayer對(duì)象
    2. 方案2 就可以直接通過(guò)更改播放項(xiàng)來(lái)間接更換播放遠(yuǎn)程音樂(lè)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姻蚓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子匣沼,更是在濱河造成了極大的恐慌狰挡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件释涛,死亡現(xiàn)場(chǎng)離奇詭異加叁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)唇撬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)它匕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人窖认,你說(shuō)我怎么就攤上這事豫柬。” “怎么了扑浸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烧给,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我喝噪,道長(zhǎng)创夜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任仙逻,我火速辦了婚禮驰吓,結(jié)果婚禮上涧尿,老公的妹妹穿的比我還像新娘。我一直安慰自己檬贰,他們只是感情好姑廉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著翁涤,像睡著了一般桥言。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葵礼,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天号阿,我揣著相機(jī)與錄音,去河邊找鬼鸳粉。 笑死扔涧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的届谈。 我是一名探鬼主播枯夜,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艰山!你這毒婦竟也來(lái)了湖雹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤曙搬,失蹤者是張志新(化名)和其女友劉穎摔吏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纵装,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舔腾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搂擦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稳诚。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瀑踢,靈堂內(nèi)的尸體忽然破棺而出扳还,到底是詐尸還是另有隱情,我是刑警寧澤橱夭,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布氨距,位于F島的核電站,受9級(jí)特大地震影響棘劣,放射性物質(zhì)發(fā)生泄漏俏让。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望首昔。 院中可真熱鬧寡喝,春花似錦、人聲如沸勒奇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赊颠。三九已至格二,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竣蹦,已是汗流浹背顶猜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痘括,地道東北人长窄。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像远寸,于是被迫代替她去往敵國(guó)和親抄淑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屠凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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