音视频,简单点,上手就用,当然是 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 )。
怎么设置聚焦
还有视频的合成,将多个视频片段合成为一个视频文件。
最后是,关于给视频添加图形覆盖和动画。
推荐资源:
AVFoundation Programming Guide 苹果文档
视频教程
大佬博客, AVPlayer 本地、网络视频播放相关