AVFoundation-音乐播放

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

播放本地音乐--使用AVAudioPlayer

  1. 导入AVFoundation框架

    #import <AVFoundation/AVFoundation.h>
    
  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 就可以直接通过更改播放项来间接更换播放远程音乐
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容