音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间比较短, 播放频率比较高的, 当做音效处理;
- 本地音乐播放:通过AVAudioPlayer实现。AVAudioPlayer的父类是NSObject
- 远程音乐播放:通过AVPlayer实现。AVPlayer的父类是NSObject
播放本地音乐--使用AVAudioPlayer
-
导入AVFoundation框架
#import <AVFoundation/AVFoundation.h>
-
使用AVAudioPlayer类, 进行播放音频
// 1. 根据音频文件URL, 创建AVAudioPlayer对象 // 获取资源URL NSURL *url = [[NSBundle mainBundle] URLForResource:@"简单爱.mp3" withExtension:nil]; // 根据资源URL, 创建 AVAudioPlayer 对象 _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; // 2. 准备播放 // 准备播放 [_audioPlayer prepareToPlay]; // 3. 开始播放 [self.audioPlayer play];
-
附加设置
// 暂停 [self.audioPlayer pause]; // 停止 [self.audioPlayer stop]; // 停止某个音乐, 下次再播放, 会从当前位置开始播放 self.audioPlayer.currentTime = 0; // 重置当前播放时间 // 快进 // 系统已经对currentTime, 做了容错处理, 不用担心时间为负数或者大于音乐总时长 self.audioPlayer.currentTime += 5; // 倍速播放 // 1.0 为正常 // 设置允许调整播放速率, 注意, 此方法必须设置在准备播放之前(经测试, 在播放前也可以) self.audioPlayer = nil; self.audioPlayer.enableRate = YES; self.audioPlayer.rate = 2.0; // 音量调节 // 0.0 --- 1.0 self.audioPlayer.volume = slider.value; // 监听播放事件 // 1. 设置代理 // 2. 实现代理方法
-
后台播放
1. 勾选后台模式 2. 激活音频播放会话 ** 注意: 模拟器测试不准确, 以真机为准; ** 3. 实现代码(在播放器play方法中实现下述代码):
// 1. 获取音频会话 AVAudioSession *session = [AVAudioSession sharedInstance]; // 2. 设置会话分类 [session setCategory:AVAudioSessionCategoryPlayback error:nil]; // 3. 激活会话 [session setActive:YES error:nil];
音频会话
1. 在iOS中每个应用都有一个音频会话,这个会话就通过AVAudioSession来表示。AVAudioSession同样存在于AVFoundation框架中,它是单例模式设计,通过sharedInstance进行访问
2. 音频会话类型简介
1. AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放
2. AVAudioSessionCategorySoloAmbient 独占播放
3. AVAudioSessionCategoryPlayback 后台播放,也是独占的
4. AVAudioSessionCategoryRecord 录音模式,用于录音时使用
5. AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放
6. AVAudioSessionCategoryAudioProcessing 硬件解码音频,此时不能播放和录制
7. AVAudioSessionCategoryMultiRoute 多种输入输出,例如可以耳机、USB设备同时播放-
swift实现音乐播放(包含后台播放功能)
import UIKit import AVFoundation class ViewController: UIViewController { func playBack() -> () { // 1. 获取音频会话 let session = AVAudioSession.sharedInstance() do { // 2. 设置会话类别 try session.setCategory(AVAudioSessionCategoryPlayback) // 3. 激活会话 try session.setActive(true) }catch { print(error) return } } lazy var player: AVAudioPlayer? = { // 1. 创建一个播放器 guard let url = NSBundle.mainBundle().URLForResource("简单爱.mp3", withExtension: nil) else { return nil } do { // 当播放另外一首歌曲的时候, 需要重新创建对应的播放器 // 不能播放远程音频, 只能播放本地音频 let player = try AVAudioPlayer(contentsOfURL: url) // 设置代理, 可以监听播放器的一些事件 player.delegate = self // 设置启动倍速播放功能, 一定要放到 prepareToPlay, 之前设置 player.enableRate = true // 2. 准备播放(系统会分配资源) player.prepareToPlay() return player }catch { print(error) return nil } }() } // MARK: - 播放功能 extension ViewController { @IBAction func play() { // 3. 开始播放 player?.play() // 后台播放, 两个条件 // 0. 勾选后台模式 // 1. 生成并激活会话对象 playBack() } @IBAction func stop() { // 停止, 必须手动清除, currentTime player?.currentTime = 0 player?.stop() } @IBAction func pause() { player?.pause() } @IBAction func kuaijin() { // 内部已经做好了容错处理 // 不会出现大于音频最大时长, 或者, 小于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("播放完成") } }
-
使用须知
> 每一个AVAudioPlayer对象对应一个音频播放, 如果想播放多个音频, 就需要创建多个AVAudioPlayer; > 使用AVAudioPlayer类, 只能播放本地资源, 不能播放远程音乐
-
测试环境
> 后台播放,需要使用真机进行测试, 模拟器不准确
播放远程音乐--使用AVPlayer
- 方案一:
// 1. 根据URL, 创建AVPlayer self.player = [[AVPlayer alloc] initWithURL:@"http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4"]; // 2. 播放 [self.player paly];
- 方案二:
// 1. 根据AVPlayerItem, 创建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];
- 方案对比:
1. 如果通过方案1播放某个远程音频, 那么后面如果想要更改音乐, 则需要重新创建AVPlayer对象
2. 方案2 就可以直接通过更改播放项来间接更换播放远程音乐