音频播放AVPlayer

音频播放器AVaudioPlayer(专门负责音频)

import UIKit
import AVFoundation
class AnalyseMedia: NSObject {

    //注:当前方法中不涉及任何类的属性的时候,可以将这个方法声明称类型方法,方便直接使用类名来调用
    //分析歌曲信息
    static func analyseMusic(name:String)->MediaModel{
        
        //拿到路径
        let url = NSURL.init(fileURLWithPath: NSBundle.mainBundle().pathForResource(name, ofType: nil)!)
        //1.创建媒体解析器对象
        //参数:需要解析的媒体资源的路径
        let asset = AVURLAsset.init(URL: url)
        
        //2.获取格式
        let format = asset.availableMetadataFormats.first
        
        //3.根据指定的格式去获取信息
        let infoArray = asset.metadataForFormat(format!)
        
        //4.遍历数组获取所有的信息
        //a.创建模型用来获取所有的相关信息
        let model = MediaModel()
        //b.遍历拿到不同的信息
        for item in infoArray {
            //c.通过判断commonKey属性,去获取不同的信息
            //1.演唱者
            if item.commonKey == "artist" {
                model.artist = item.value as! String
            }
            
            //2.专辑名
            if item.commonKey == "albumName" {
                
                model.albumName = item.value as! String
            }
            
            //3.歌曲名
            if item.commonKey == "title" {
                
                model.title = item.value as! String
            }
            
            //4.插图
            if item.commonKey == "artwork" {
                
                let data = item.value as! NSData
                model.artwork = UIImage.init(data: data)
            }
            
        }
        
        //将信息返回
        return model
        
    }
    

class MediaModel: NSObject {
    
    ///演唱者
    var artist = ""
    ///专辑名
    var albumName = ""
    ///歌曲名
    var title = ""
    ///插图
    var artwork:UIImage? = nil
    
}

ViewController 中的代码

import UIKit

//使用AVAudioPlayer需要包含AVFoundation库文件
import AVFoundation


class ViewController: UIViewController {
    
    //MARK: - 属性
    //注意:播放器对象必须声明成属性
    var player:AVAudioPlayer? = nil
    @IBOutlet weak var slider: UISlider!
    
    @IBOutlet weak var imageView: UIImageView!
    
    //MARK: - 生命周期
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.creatPlayer("蓝莲花.mp3")
        
        //添加定时器
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "updateSlider", userInfo: nil, repeats: true)
        
        
    }
    
}

//MARK: - 创建播放器
extension ViewController{

    func creatPlayer(name:String) {
        
        //1.创建音频路径(网络地址/本地)
        let path = NSBundle.mainBundle().pathForResource(name, ofType: nil)
        //将本地路径转换成url
        let url = NSURL.init(fileURLWithPath: path!)
        
        //将网络地址转换成url
        //let url = NSURL.init(string: <#T##String#>)
        
        //2.根据url创建播放器对象
        do{
        
            let tPlyer = try AVAudioPlayer.init(contentsOfURL: url)
            self.player = tPlyer
        }catch{
        
            print("音频路径不对")
        }
        
        
        //3.准备播放
        self.player?.prepareToPlay()
        
        //4.开始播放。
        //音频播放器实质没有任何界面的,只是用来播放声音
        //self.player?.play()
        
        //5.音量(范围:0-1)
        self.player?.volume = 0.5
        
        //6.设置代理
        self.player?.delegate = self
        
        //7.显示图片
        let model = AnalyseMedia.analyseMusic(name)
        self.imageView.image = model.artwork
    }
}

//MARK: - PlayerDelegate
extension ViewController:AVAudioPlayerDelegate{

    //已经结束播放的时候会自动调用
    func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool){
    
        //切换到下一首(实质是重新创建一个对应的播放器)
        self.creatPlayer("江南-style.mp3")
        //切换后需要手动开始播放
        self.player?.play()
    }
}

//MARK: - 播放进度
extension ViewController{
    
    //刷新进度条
    func updateSlider() {
        
        //拿到当前时间
        let time = Float((self.player?.currentTime)!)
        //拿到总时间
        let duration = Float((self.player?.duration)!)
        
        self.slider.value = time/duration
    }

    @IBAction func sliderAction(sender: UISlider) {
        
        //拿到当前播放器播放的音乐的总时间
        let duration = self.player?.duration
        
        //设置当前播放时间
        self.player?.currentTime = duration! * Double(sender.value)
        
    }
    
}

//MARK: - 音量
extension ViewController{

    @IBAction func stepAction(sender: UIStepper) {
        
        self.player?.volume = Float(sender.value)
    }
    
}
//MARK: - 音频的播放和暂停
extension ViewController{

    @IBAction func playAction(sender: UIButton) {
        
        //判断当前播放器是否正在播放音乐
        if self.player?.playing == true {
            //5.暂停
            //self.player?.stop()
            self.player?.pause()
            
            sender.setTitle("播放", forState: .Normal)
            
        }else{
        
            //4.开始播放
            self.player?.play()
            //让按钮显示暂停
            sender.setTitle("暂停", forState: .Normal)
        }
    }
    
}

AVPlayer音频

class ViewController: UIViewController {

    //MARK: - 属性
    lazy var player:AVPlayer = {
    
        return self.creatPlayer()
    }()
    //进度条
    @IBOutlet weak var slider: UISlider!
    //图片
    @IBOutlet weak var imageView: UIImageView!
    //歌词解析器
    let lyricManager = YTAnalysis()
    
    @IBOutlet weak var lyricLabel: UILabel!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //1.注册观察者,去观察播放器播放结束的时刻(AVPlayer在播放完成后,消息中心会自动发送播放完成对应的消息)
        //AVPlayerItemDidPlayToEndTimeNotification ->消息名
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "finishedPlay", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
        
        //2.获取播放器的播放进度
        //参数1:时间间隔(每隔多长时间获取一次播放进度),1秒
        //参数2:执行参数3中的任务的队列
        //参数3:每隔1秒需要执行的任务
        self.player.addPeriodicTimeObserverForInterval(CMTimeMake(1, 10), queue: dispatch_get_main_queue()) { (cmCurrent) in
            //闭包中的参数:当前时间(CMTime)
            
            //a.总的时间
            let cmDuration = self.player.currentItem?.duration
            //秒对应的总时间
            let duration = Float((cmDuration?.value)!) / Float((cmDuration?.timescale)!)
            
            //b.秒对应的当前时间
            let current = Float(cmCurrent.value) / Float(cmCurrent.timescale)
            
            //计算百分比
            self.slider.value = current / duration
            
            //获取指定时间对应的歌词
            let str = self.lyricManager.getLyricWithTime(Double(current))
            
            self.lyricLabel.text = str
            
        }
        
        
        
    }

}

//MARK: - 播放进度
extension ViewController{

    @IBAction func sliderAction(sender: UISlider) {
        
        //1.CMTime基础:
        //总时间:总帧数/每一秒播放的帧数
        //当前时间:当前帧数/每一秒播放的帧数
        //将播放器定位到指定的时间
        //在AVPlayer中所有的时间都是以CMTime来确定
        //CMTime中的value属性代表帧数,timeScale代表每一秒播放的帧数。一个CMTime变量确定的真正的时间是value/timescale
        //确定一个第10秒
        //let cmTime = CMTimeMake(100, 10)
        //let cmTime = CMTimeMake(10, 1)
        
        
        //2.定位到指定进度
        //a.拿到当前播放源的总时间(CMTime)
        let cmDuration =  self.player.currentItem?.duration
        //转换成秒单位时间
        let duration = Double((cmDuration?.value)!) / Double((cmDuration?.timescale)!)
        
        //b.根据进度条计算出当前时间
        let currentTime = duration * Double(sender.value)
        
        //c.定位到指定的位置
        self.player.seekToTime(CMTimeMake(Int64(currentTime), 1))
        
    }
    
}

//MARK: - 切换播放源
extension ViewController{

    func finishedPlay() {
        
        print("完成")
        self.changeItem("北京北京")
    }
    
    func changeItem(name:String){
        
        //1.创建新的播放源
        let url = NSURL.init(fileURLWithPath: NSBundle.mainBundle().pathForResource(name, ofType:"mp3")!)
        let newItem = AVPlayerItem.init(URL: url)
        
        //2.替换播放源
        self.player.replaceCurrentItemWithPlayerItem(newItem)
        
        //3.开始播放
        self.player.play()
        
        //4.更新图片
        self.imageView.image = AnalyseMedia.analyseMusic(name+".mp3").artwork
    }
}


//MARK: - 控制音量和速度
extension ViewController{

    @IBAction func rateAction(sender: UIStepper) {
        
        //改变播放速度(0.5-2)
        self.player.rate = Float(sender.value)
        
    }
    
    @IBAction func volumeAction(sender: UIStepper) {
        
        //改变音量(0-1)
        self.player.volume = Float(sender.value)
    }
    
}

//MARK: - 播放和暂停
extension ViewController{

    @IBAction func playAction(sender: UIButton) {
        
        if sender.currentTitle == "播放" || sender.currentTitle == "继续" {
            
            //1.开始播放
            self.player.play()
            
            sender.setTitle("暂停", forState: .Normal)
        }else{
        
            //2.暂停播放
            self.player.pause()
            
            sender.setTitle("继续", forState: .Normal)
        }
    }
    
}

//MARK: - 创建播放器
extension ViewController{

    func creatPlayer()->AVPlayer{
        
        //1.获取播放路径
        let url = NSURL.init(fileURLWithPath: NSBundle.mainBundle().pathForResource("蓝莲花.mp3", ofType: nil)!)
        
        //2.创建播放源
        let item = AVPlayerItem.init(URL: url)
        
        //3.创建播放器对象
        let tPlayer = AVPlayer.init(playerItem: item)
        
        //4.获取歌曲信息
        self.imageView.image = AnalyseMedia.analyseMusic("蓝莲花.mp3").artwork
        
        //5.解析歌词
        self.lyricManager.analysisLyricWithPath(NSBundle.mainBundle().pathForResource("蓝莲花.lrc", ofType: nil))
        
        return tPlayer
    }
}

AVPlayer视频播放

import UIKit
import AVFoundation

class ViewController: UIViewController {
    //MARK: - 属性
    lazy var player:AVPlayer = {
    
        return self.creatPlayer()
    }()
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //1.开始播放
        self.player.play()
        
        
        self.creatPlayView()
    }

}

//MARK: - 添加播放器的播放界面
extension ViewController{

    func creatPlayView() {
        
        //AVPlayerLayer:专门负责显示AVPlayer中的视频图像的类
        //1.创建播放页面对象
        let playLayer = AVPlayerLayer.init(player: self.player)
        //2.设置frame
        playLayer.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 300)
        //3.添加到界面上
        self.view.layer.addSublayer(playLayer)
        
        //4.添加暂停和播放按钮
        let button = UIButton.init(frame: CGRectMake(0, 0, 30, 30))
        button.center = CGPointMake(self.view.center.x, 220)
        button.backgroundColor = UIColor.init(white: 0.2, alpha: 0.6)
        button.addTarget(self, action: "stop", forControlEvents: .TouchDown)
        self.view.addSubview(button)
    }
    
    func stop() {
        
        self.player.pause()
    }
    
}



//MARK: - 创建播放器
extension ViewController{

    func creatPlayer()->AVPlayer {
        
        //1.创建播放源
        //本地视频
        //let url = NSURL.init(fileURLWithPath: NSBundle.mainBundle().pathForResource("MovieTest.mp4", ofType: nil)!)
        //网络视频
        let url = NSURL.init(string: "http://otmv.alicdn.com/new/mv_1_6/23/77/2306cd13e3dde338b53f404ece43a277.mp4?k=7125c1a8f09b70bb&t=1451830866")
        let item = AVPlayerItem.init(URL: url!)
        
        //2.根据播放源创建播放器
        let tPlayer = AVPlayer.init(playerItem: item)
        
        //3.返回
        return tPlayer
    }
}


MPMoviePlayerController

import UIKit
import MediaPlayer

class ViewController: UIViewController {
    
    //MARK: - 属性
    var playerController:MPMoviePlayerController? = nil
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //0.创建播放源路径
        //let url = NSURL.init(fileURLWithPath: NSBundle.mainBundle().pathForResource("MovieTest.mp4", ofType: nil)!)
        
        let url = NSURL.init(string: "http://123.56.17.178:8080/mgtv.php?vid=b656XJyg5Y85HIOq+eW/kYGtHIMX7lYiFBntHHuD2IsVs9Sa")
       
        //1.创建对象
        self.playerController = MPMoviePlayerController.init(contentURL: url)
        //2.设置播放器界面的大小
        self.playerController?.view.frame = self.view.bounds
        //3.添加播放器界面
        self.view.addSubview((self.playerController?.view)!)
        
        //4.开始播放
        self.playerController?.play()
        
        //5.获取播放结束的时刻
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "endPlay", name: MPMoviePlayerPlaybackDidFinishNotification, object: nil)
        
        
    }
    
    
    func endPlay() {
        
        print("结束")
    }


}


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

推荐阅读更多精彩内容