毕业后一直在搞 SDK 开发,说真的,对面 UI 层的知识完全不重视,但工作不是不学习的理由,现在空闲时间,补全下自己对 UI 层的基础,也顺便熟悉下 Swift。
图片.png视频录制
这里使用UIImagePickerController进行视频录制,这里其实很简单,主要就是配置下相关的参数,因为UIImagePickerController可以实现拍照、录制视频、获取相册照片和视频等功能:
private lazy var picker: UIImagePickerController = {
var picker = UIImagePickerController()
picker.mediaTypes = [kUTTypeMovie as String]
picker.sourceType = .camera
picker.cameraCaptureMode = .video
picker.delegate = self
return picker
}()
这里直接使用懒加载的方式设置picker,我想,很多从oc转到swift时,肯定会纠结如何实现setter和懒加载这个问题,我承认我也入坑过~~~
在页面实现一个点击按钮进行录制跳转:
@IBAction func recordVideo(_ sender: AnyObject) {
present(picker, animated: true, completion: nil)
}
这样,一个简单的录制功能就已经完成了,但我们还是需要监听下录制完成或者取消录制的回调,从而获取所需的值:
// MARK: - UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
videoUrl = info[UIImagePickerControllerMediaURL] as! URL?
picker.dismiss(animated: true, completion: nil)
}
这里在录制完成后,获取保存的url进行访问。如果 ViewController 内容太多,这里是建议通过extension ViewController 来实现对应的delegate的回调方法:
extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
// MARK: - UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
videoUrl = info[UIImagePickerControllerMediaURL] as! URL?
picker.dismiss(animated: true, completion: nil)
}
}
但这里需要注意的是,如果用 extension 时,就要把 videoUrl 的 private 改为 fileprivate。
视频播放
录制完成后,就可以使用获得的视频url进行播放:
private lazy var playVC: AVPlayerViewController = AVPlayerViewController()
@IBAction func playVideo(_ sender: AnyObject) {
if videoUrl != nil {
let player = AVPlayer(url: videoUrl!)
playVC.player = player
present(playVC, animated: true, completion: nil)
}
}
这里一样使用了lazy的方法,这里就说明什么使用lazy,用过oc的应该懂的。还有,这里使用的虽然是刚才录制的视频,但其它的本地视频文件也是一样的,传相应url就可以了,但并不是所有格式的视频都能解码,详细可以看下官方文档的说明,这里就不详细介绍了。
扩展
UIImagePickerController 是实现照片视频拍摄的,还能获取本地照片和视频,看下UIImagePickerControllerSourceType:
public enum UIImagePickerControllerSourceType : Int {
case photoLibrary // 图库
case camera // 相机
case savedPhotosAlbum // 相册
}
UIImagePickerControllerCameraCaptureMode:
public enum UIImagePickerControllerCameraCaptureMode : Int {
case photo // 拍摄照片
case video // 录制视频
}
通过设置相应的参数,就可以实现不同的功能,这里就不一一说了,直接看下UIImagePickerController相应的api应该就可以了。
小结
工作不是不学习的理由,你会就是会,不会就是不会。千里之行,始于足下。