涉及硬件的音视频能力,比如采集、渲染、硬件编码、硬件解码,通常是与客户端操作系统强相关的,就算是跨平台的多媒体框架也必须使用平台原生语言的模块来支持这些功能
本系列文章将详细讲述移动端音视频的采集、渲染、硬件编码、硬件解码这些涉及硬件的能力该如何实现
本文为该系列文章的第 1 篇,将详细讲述在 iOS 平台下如何实现摄像头的视频采集
前言
视频采集,从编程的角度来看,也就是拿到摄像头采集到的图像数据,至于拿到数据之后的用途,可以五花八门,想干嘛就干嘛,比如:存储为照片、写入本地文件、编码后进行传输、本地预览
CMSampleBuffer
在开始之前,必须先了解 CMSampleBuffer 的概念,它可以简单理解为媒体数据之外加了一层封装,在视频相关场景下,其可以包含未编码的视频数据(CVPixelBuffer),也可以包含编码过的视频数据(CMBlockBuffer)
CMSampleBuffer 组成部分
-
CMTime:图像的时间
-
CMVideoFormatDescription:图像格式的描述
-
CMBlockBuffer or CVPixelBuffer:编码后的图像数据 or 未编码的图像数据
整体流程
申请摄像头权限
真正开始视频采集之前,需要在应用层向用户申请摄像头权限
在 App 的 info.plist 中添加键值对,key 为 “Privacy - Camera Usage Description”,value 为申请摄像头权限的原因
在启动视频采集之前,检查摄像头权限
-
如果处于“权限未定”状态,需要调用系统 API 进行权限申请,有结果之后再根据权限确定后续流程
-
如果处于“已授权”状态,走正常流程
-
如果处于“未授权”状态,走异常流程,UI 上可能要引导用户自行到手机的设置中打开本应用的摄像头权限
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (status == AVAuthorizationStatusNotDetermined) {
// 权限未定,进行申请
[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:completionHandler];
} else if (status == AVAuthorizationStatusAuthorized) {
// 已授权,走正常流程
} else {
// 未授权,走异常流程
}
初始化 + 参数设置
AVCaptureSession
针对视频采集,Apple 只给了一套 API,就是 AVCaptureSession,十分简单明了
AVCaptureSession 的运行需要有 input 和 output
input 通常与摄像头设备关联,也就是 AVCaptureDeviceInput
output 可以有多种类型,本文将着重介绍 AVCaptureVideoDataOutput,就是能直接拿到原始视频数据的 output 类型,其他类型比如 AVCaptureStillImageOutput、AVCaptureMovieFileOutput 都是在原始数据的基础上满足了个性化的需求,例如:拍照、视频存本地