音頻播放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("結束")
    }


}


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容