当前位置: 游戏平台 > 互联网科技 > 正文

iOS基础篇-AVPLayer和AVAudioSession

时间:2020-04-28 11:25来源:互联网科技
作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间
  • 作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入
    音效和音乐? 其实并没有严格意义上的限定,一般在开发中,将时间比较短, 播放频率比较高的, 当做音效处理;

写在前面

公司近期要求在App内嵌入音频播放,由于之前对于音视频播放只是简单了解,并没有系统的研究。这次需要用到的时候就翻阅各种贴子,各个大神的笔记,博客,话说总结是最好的学习方法,所以,自己根据自己的理解,也总结一篇相关的贴子吧,记录一下。不求有用,但求方便。

  1. 本地音乐播放:通过AVAudioPlayer实现。AVAudioPlayer的父类是NSObject
  2. 远程音乐播放:通过AVPlayer实现。AVPlayer的父类是NSObject

一.关于音频(视频下篇总结)

一般情况下,播放音频分为两种,一种是本地音频播放,一种是网络音频播放。播放本地一般使用AVAudioPlayer,播放网络文件较多使用AVPlayer,所以下文只针对AVPlayer进行总结。

针对多媒体,苹果官方打造了一个类库---AVFoundation框架。这个库非常强大,专门用来处理音视频等多媒体技术,而本文主要讲AVFoundation下的一个类-----AVPlayer。

什么是AVPlayer?

你可以把它看成是一个已经封装好的播放器,它的作用可以用来播放视频和音频。

#import <AVFoundation/AVFoundation.h>

播放本地音乐--使用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进行访问

    1. 音频会话类型简介
    2. AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放
    3. AVAudioSessionCategorySoloAmbient 独占播放
    4. AVAudioSessionCategoryPlayback 后台播放,也是独占的
    5. AVAudioSessionCategoryRecord 录音模式,用于录音时使用
    6. AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放
    7. AVAudioSessionCategoryAudioProcessing 硬件解码音频,此时不能播放和录制
    8. 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. 测试环境

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

二.用法

  • AVAudioSession中配置选项:

播放远程音乐--使用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 就可以直接通过更改播放项来间接更换播放远程音乐

1.创建工程,导入AVFoundation框架。然后在需要播放音频的界面创建播放器实例。

AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"http://xxxxxxxx"]];

player = [[AVPlayer alloc] initWithPlayerItem:item];

AVAudioSessionCategory

2.播放、停止

播放

[player play];

停止

[player pause];

编辑:互联网科技 本文来源:iOS基础篇-AVPLayer和AVAudioSession

关键词: