iOS音頻與視頻的開發(一)-使用AVAudioPlayer播放音樂、使用AVPlayerViewController播放視頻


  iOS的多媒體支持非常強大,它提供了多套支持多媒體的API,無論是音頻、視頻的播放,還是錄制,iOS都提供了多種API支持。借助於這些API的支持,iOS應用既可以查看、播放手機相冊中的照片、視頻,也可以播放來自網絡的視頻.iOS也提供了對攝像頭、麥克風的支持。

1、使用AVAudioPlayer播放音樂

  AVAudioPlayer比較簡單,當控制AVAudioPlayer對象裝載音頻完成后,就可以調用AVAudioPlayer的如下方法進行播放控制了。

  如:play/pause/stop/prepareToPlay.

  其中:如果調用play方法時,如果音頻還沒有准備好,程序會隱式先執行prepareToPlay方法。

  除此之外,AVAudioPlayer還提供了如下屬性來訪問音頻文件的相關信息。

  playing:該屬性(只讀)返回播放器是否正在播放。

  pan:該屬性用於設置或返回立體聲平衡。如果該屬性設為-1.0,則完全在左邊播放;如果設為0.0則左右音量相同;如果設為1.0,則完全右邊播放。

  enableRate:是否允許改邊播放速率。

  numberOfLoops:設置循環次數。如果為-1標識無限循環。

  numberOfChannels:返回音頻的聲道數目。

  duration:音頻的持續時間

  currentTime:獲取音頻的播放點。

  url:返回播放器關聯的音頻URL。

 案例代碼:

import UIKit
import AVKit
class NADiscoverViewController : UIViewController {
    
    lazy var audioPlayer = AVAudioPlayer.init()
    var durationTime:Float = 0.0 //播放時長
    var timer : Timer?
    
    lazy var startBtn : UIButton = {
        let startBtn = UIButton()
        startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
        startBtn.addTarget(self, action: #selector(playAction(sender:)), for: .touchUpInside)
        return startBtn
    }()
    
    lazy var finishBtn : UIButton = {
        let finishBtn = UIButton()
        finishBtn.setImage(UIImage.init(named: "jieshu"), for: .normal)
        finishBtn.addTarget(self , action: #selector(endAction(sender:)), for:.touchUpInside)
        return finishBtn
    }()
    
    lazy var progress : UIProgressView = {
        let progress = UIProgressView()
        return progress
    }()
    
    lazy var messageLabel : UILabel = {
        let messageLabel = UILabel()
        messageLabel.text = "時長"
        messageLabel.numberOfLines = 0
        return messageLabel
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.title = "發現"
        
        setSubViewConstraints()
        let fileURL : URL = Bundle.main.url(forResource: "a", withExtension: "mp3")!
        
        do {
            let player : AVAudioPlayer = try AVAudioPlayer.init(contentsOf: fileURL)
            audioPlayer = player
        }catch{}
        let str = String.init(format: "音頻文件的聲道數:%d\n音頻文件的持續時間:%g", audioPlayer.numberOfChannels,audioPlayer.duration)
        messageLabel.text = str
        durationTime = Float(audioPlayer.duration)
        //將循環次數設為-1,用於指定該音頻文件循環播放
        audioPlayer.numberOfLoops = -1
        audioPlayer.delegate = self
    }
    
    @objc func playAction(sender:UIButton) -> Void {
        if audioPlayer.isPlaying {
            audioPlayer.pause()
            startBtn.setImage(UIImage.init(named: "bofang"), for: .normal)
        } else {
            audioPlayer.play()
            startBtn.setImage(UIImage.init(named: "zanting"), for: .normal)
        }
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProge), userInfo: nil, repeats: true)
        }
    }
    @objc func endAction(sender:UIButton) -> Void {
        audioPlayer.stop()
        timer?.isValid
        timer = nil
    }
    
    @objc func updateProge() {
        progress.progress = Float(audioPlayer.currentTime) / durationTime
    }
    func setSubViewConstraints() -> Void {
        view.addSubview(startBtn)
        startBtn.snp.makeConstraints { (make) in
            make.top.equalTo(100)
            make.left.equalTo(50)
            make.width.height.equalTo(50)
        }
        
        view.addSubview(finishBtn)
        finishBtn.snp.makeConstraints { (make) in
            make.top.equalTo(startBtn)
            make.right.equalTo(-50)
            make.width.height.equalTo(50)
        }
        
        view.addSubview(progress)
        progress.snp.makeConstraints { (make) in
            make.top.equalTo(startBtn.snp_bottom).offset(30)
            make.left.equalTo(50)
            make.right.equalTo(-50)
        }
        view.addSubview(messageLabel)
        messageLabel.snp.makeConstraints { (make) in
            make.top.equalTo(progress.snp_bottom).offset(30)
            make.left.equalTo(50)
            make.right.equalTo(-50)
        }
    }
}

extension NADiscoverViewController : AVAudioPlayerDelegate {
    //當audioplayer播放完成后將會自動播放
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        if player == audioPlayer && flag {
            print("播放完成")
            
        }
    }
    
    func audioPlayerBeginInterruption(_ player: AVAudioPlayer) {
        if player == audioPlayer {
            print("被中斷了")
        }
    }
}
播放本地音樂

 效果圖:

2、使用AVPlayerViewController播放視頻

  支持的視頻編碼格式很有限:H.264、MPEG-4,擴展名(壓縮格式):.mp4、.mov、.m4v、.m2v、.3gp、.3g2等,如果是RMVB就不行了,需要借助第三方的框架來實現更多格式的支持。

  使用AVPlayerViewController之前先導入AVKit頭文件

  AVPlayerViewController中集成了AVPlayer,AVPlayer提供了一些方法可以輕易實現對視頻播放的控制

  如:play/pause/status

  AVPlayerViewController常用屬性:

  showsPlaybackControls:是否顯示回放控制

  entersFullScreenWhenPlaybackBegins:開啟這個播放的時候支持(全屏)橫豎屏

  exitsFullScreenWhenPlaybackEnds:開啟這個播放結束的時候,可以退出全屏

  案例代碼:

import UIKit
import AVKit
class NAPublishViewController : UIViewController {
    var moviePlayer = AVPlayerViewController.init()
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let movieUrl : URL = Bundle.main.url(forResource: "movie", withExtension: "mp4")!
        //使用指定的url創建MPMoviesPlayerController
        moviePlayer.player = AVPlayer.init(url: movieUrl)
        //是否顯示回放控制
        moviePlayer.showsPlaybackControls = true
        //開啟這個播放的時候支持(全屏)橫豎屏
        if #available(iOS 11.0, *) {
            moviePlayer.entersFullScreenWhenPlaybackBegins = true
        }
        //開啟這個播放結束的是否,可以退出全屏
        if #available(iOS 11.0, *) {
            moviePlayer.exitsFullScreenWhenPlaybackEnds = true
        }
        view.addSubview(moviePlayer.view)
        //判斷moviePlayer已經准備好視頻第一播放幀
        if moviePlayer.isReadyForDisplay {
            moviePlayer.player?.play()
        }
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
AVPlayerViewController播放視頻

  通過上面幾行代碼,就可以實現本地或網絡視頻的播放。

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM