音視頻,簡單點,上手就用,當然是 AVKit.
更加靈活的控制,就要用到 AVFoundation 了。
要點:
- 使用資源(一般就是照片庫裏面的視頻,圖片,live photo),
- 播放,
- 編輯,
- 捕捉(拍照和錄視頻)
- 導出資源(就處理過的資源,拍的照片,編輯的視頻,導出到相冊)
AVFoundation , 視頻的加載與導出,大量使用異步。
簡單的發消息, 肯定是不行的。阻塞當前線程, 卡頓很久很久。
AVFoundation 就是爲了充分利用64位的硬件和多線程設計的。
首先是播放,
播放本地的視頻文件, 和遠程的視頻與流媒體。
本地文件,單個播放
先講 AVKit 裏面的 AVPlayerViewController.
AVPlayerViewController 是 ViewController 的子類,
AVPlayerViewController 在 TV OS 上,非常強大。(本文僅介紹 iOS 平臺下)
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 的子類。
按順序,播放多個資源。
AVPlayerItem 包含很多視頻資源信息,除了資源定位 URI , 還有軌跡信息,視頻的持續時長等。
蘋果文檔上說, AVPlayerItem 用於管理播放器播放的資源的計時和呈現狀態。他有一個 AVAsset 播放資源的屬性。
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 支持後臺音效,
在 Appdelegate
的 didFinishLaunchingWithOptions
中添加下面的這段代碼,使用後臺模式,
首先在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 )。
怎麼設置聚焦