AVKit 播放(AVFoundation, AVKit, 音視頻, Swift 4, 配代碼)

音視頻,簡單點,上手就用,固然是 AVKit.
更加靈活的控制,就要用到 AVFoundation 了。html


要點:

  • 使用資源(通常就是照片庫裏面的視頻,圖片,live photo),
  • 播放,
  • 編輯,
  • 捕捉(拍照和錄視頻)
  • 導出資源(就處理過的資源,拍的照片,編輯的視頻,導出到相冊)

AVFoundation , 視頻的加載與導出,大量使用異步。
簡單的發消息, 確定是不行的。阻塞當前線程, 卡頓好久好久。
AVFoundation 就是爲了充分利用64位的硬件和多線程設計的。git


首先是播放,

播放本地的視頻文件, 和遠程的視頻與流媒體。github

本地文件,單個播放

先講 AVKit 裏面的 AVPlayerViewController.
AVPlayerViewController 是 ViewController 的子類,網絡

AVPlayerViewController

AVPlayerViewController 在 TV OS 上,很是強大。(本文僅介紹 iOS 平臺下)session

AVPlayerViewController 裏面有不少播放的控件。
回播中,就是播放本地文件中,能夠播放、暫停、快進、快退,調整視頻的長寬比例( 即畫面在屏幕中適中,或者鋪滿屏幕)。多線程

播放視頻,蘋果設計的很簡單,代碼以下:閉包

//  拿一個 url , 創建一個 AVPlayer 實例
    let player = AVPlayer(url: "你的 url")
    //  再創建一個 AVPlayerViewController 實例
    let playerViewController = AVPlayerViewController()
    
    playerViewController.player = queuePlayer
    
    present(playerViewController, animated: true) {
        playerViewController.player!.play()
    }// 這裏有一個閉包, 出現了,再播放。

本地文件,多個連續播放

連着放,使用 AVQueuePlayer,把多個視頻放在一個視頻隊列中,依次連續播放
AVQueuePlayer 是 AVPlayer 的子類。
按順序,播放多個資源。
AVQueuePlayerapp

AVPlayerItem 包含不少視頻資源信息,除了資源定位 URI , 還有軌跡信息,視頻的持續時長等。異步

蘋果文檔上說, AVPlayerItem 用於管理播放器播放的資源的計時和呈現狀態。他有一個 AVAsset 播放資源的屬性。ide

var queue = [AVPlayerItem]()   
   let videoClip = AVPlayerItem(url: url)
   queue.append(videoClip)
    //   queue 隊列能夠繼續添加 AVPlayerItem 實例
    let queuePlayer = AVQueuePlayer(items: queue)

    let playerViewController = AVPlayerViewController()
    playerViewController.player = queuePlayer
    
    present(playerViewController, animated: true) {
        playerViewController.player!.play()
    }

iPad 中的畫中畫功能

iPad 中的畫中畫功能,經過給 AVAudioSession 支持後臺音效,
AppdelegatedidFinishLaunchingWithOptions 中添加下面的這段代碼,使用後臺模式,
首先在Xcode 的 target 的 Capability 中勾選相關的後臺功能。

let session = AVAudioSession.sharedInstance()
    do {
        try session.setCategory(AVAudioSessionCategoryPlayback)
        try session.setActive(true)
    } catch let error {
        print("AVFoundation configuration error: \(error.localizedDescription) \n\n AV 配置 有問題")
    }
    // 頗有必要這樣,由於畫中畫的視頻功能,apple 是當後臺任務處理的。

流媒體播放和網絡視頻播放

本地的資源路徑 URL ,替換爲網絡的 URL, 就能夠了。

優化,播放完成後,退出播放界面

override func viewDidLoad() {
        super.viewDidLoad()
        // 添加播放完成的監聽
        NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
    }

  //  執行退出的界面控制
   @objc func playerItemDidReachEnd(){
        self.presentedViewController?.dismiss(animated: true, completion: {})
    }

代碼見: https://github.com/BoxDengJZ/...

More:

其次是設置捕捉的 session ,並預覽。

設置先後攝像頭,聚焦與曝光,拍照(靜態圖片)


接下來,是導出拍的視頻文件( movie file )。

怎麼設置聚焦


還有視頻的合成,將多個視頻片斷合成爲一個視頻文件。


最後是,關於給視頻添加圖形覆蓋和動畫。


推薦資源:
AVFoundation Programming Guide 蘋果文檔

視頻教程

大佬博客, AVPlayer 本地、網絡視頻播放相關

相關文章
相關標籤/搜索