AVFoundation-音乐播放

    音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间比较短, 播放频率比较高的, 当做音效处理;
  1. 本地音乐播放:通过AVAudioPlayer实现。AVAudioPlayer的父类是NSObject
  2. 远程音乐播放:通过AVPlayer实现。AVPlayer的父类是NSObject

播放本地音乐--使用AVAudioPlayer

  1. 导入AVFoundation框架

    #import 
    
  2. 使用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];
    
  3. 附加设置

    // 暂停
        [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. 实现代理方法
    
  4. 后台播放

     1. 勾选后台模式
     2. 激活音频播放会话
     ** 注意: 模拟器测试不准确, 以真机为准; **
     3. 实现代码(在播放器play方法中实现下述代码):
    
    // 1. 获取音频会话
    AVAudioSession *session = [AVAudioSession sharedInstance];
    // 2. 设置会话分类
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    // 3. 激活会话
    [session setActive:YES error:nil];
    
  5. 音频会话
    1. 在iOS中每个应用都有一个音频会话,这个会话就通过AVAudioSession来表示。AVAudioSession同样存在于AVFoundation框架中,它是单例模式设计,通过sharedInstance进行访问
    2. 音频会话类型简介
    1. AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放
    2. AVAudioSessionCategorySoloAmbient 独占播放
    3. AVAudioSessionCategoryPlayback 后台播放,也是独占的
    4. AVAudioSessionCategoryRecord 录音模式,用于录音时使用
    5. AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放
    6. AVAudioSessionCategoryAudioProcessing 硬件解码音频,此时不能播放和录制
    7. AVAudioSessionCategoryMultiRoute 多种输入输出,例如可以耳机、USB设备同时播放

  6. 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("播放完成")
        }
    }
    
  7. 使用须知

     > 每一个AVAudioPlayer对象对应一个音频播放, 如果想播放多个音频, 就需要创建多个AVAudioPlayer;
     > 使用AVAudioPlayer类, 只能播放本地资源, 不能播放远程音乐
    
  8. 测试环境

     > 后台播放,需要使用真机进行测试, 模拟器不准确
    

播放远程音乐--使用AVPlayer

  1. 方案一:
    // 1. 根据URL, 创建AVPlayer
        self.player = [[AVPlayer alloc] initWithURL:@"http://v1.mukewang.com/a45016f4-08d6-4277-abe6-bcfd5244c201/L.mp4"];
    // 2. 播放
        [self.player paly];
    
  2. 方案二:
    // 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];
    
  3. 方案对比:
    1. 如果通过方案1播放某个远程音频, 那么后面如果想要更改音乐, 则需要重新创建AVPlayer对象
    2. 方案2 就可以直接通过更改播放项来间接更换播放远程音乐

你可能感兴趣的:(AVFoundation-音乐播放)