音效和音樂(lè)? 其實(shí)并沒(méi)有嚴(yán)格意義上的限定,一般在開(kāi)發(fā)中,將時(shí)間比較短, 播放頻率比較高的, 當(dāng)做音效處理;
- 本地音樂(lè)播放:通過(guò)AVAudioPlayer實(shí)現(xiàn)澜共。AVAudioPlayer的父類(lèi)是NSObject
- 遠(yuǎn)程音樂(lè)播放:通過(guò)AVPlayer實(shí)現(xiàn)顽冶。AVPlayer的父類(lèi)是NSObject
播放本地音樂(lè)--使用AVAudioPlayer
-
導(dǎo)入AVFoundation框架
#import <AVFoundation/AVFoundation.h>
-
使用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];
-
附加設(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)代理方法
-
后臺(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];
音頻會(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í)播放-
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("播放完成") } }
-
使用須知
> 每一個(gè)AVAudioPlayer對(duì)象對(duì)應(yīng)一個(gè)音頻播放, 如果想播放多個(gè)音頻, 就需要?jiǎng)?chuàng)建多個(gè)AVAudioPlayer; > 使用AVAudioPlayer類(lèi), 只能播放本地資源, 不能播放遠(yuǎn)程音樂(lè)
-
測(cè)試環(huán)境
> 后臺(tái)播放,需要使用真機(jī)進(jìn)行測(cè)試, 模擬器不準(zhǔn)確
播放遠(yuǎn)程音樂(lè)--使用AVPlayer
- 方案一:
// 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];
- 方案二:
// 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];
- 方案對(duì)比:
1. 如果通過(guò)方案1播放某個(gè)遠(yuǎn)程音頻, 那么后面如果想要更改音樂(lè), 則需要重新創(chuàng)建AVPlayer對(duì)象
2. 方案2 就可以直接通過(guò)更改播放項(xiàng)來(lái)間接更換播放遠(yuǎn)程音樂(lè)