使用 AVCaptureSession 去协调输入设备和输出之间的数据流。
去完成 在线 或者 离线视屏捕获,需要去实例化一个 AVCaptureSession 对象。 添加合适的输入(AVCaptureDeviceInput)和输出(AVCaptureMovieFileOutput)对象。 下面的代码示例是配置怎么去记录音频。
// 创建一个捕获回话管理者
AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
// 获取音频捕获设备
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
// 实例化一个音频输入对象
NSError *error = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];
if (audioInput) {
// 添加 输入 对象到会话管理者
[captureSession addInput:audioInput];
} else {
// Handle the failure.
}
通过调用 startRunning() 开始 inputs 到 outputs 数据流。 通过调用 stopRunning() 去停止数据流。
注意事项
startRunning() 是一个阻塞的调用,可能需要花费一些时间。因此,你需要在一个串行队列里面完成 session 的设置,来保证主队列不被阻塞。 具体细节可以查看 AVCam-iOS: Using AVFoundation to Capture Images and Movies 例子的实现细节。
你可以通过设置 sessionPreset 属性去自定义 质量水平, 比特率 或者一些其他的输出设置。最常见的捕获配置是可以通过会话预设;然而,一些专门的选项(如高帧速率)需要直接设置捕获格式AVCaptureDevice实例。
管理输入和输出
var inputs: [Any]!
// 捕获对象的输入。 这个数组包含了 AVCaptureInput 子类的实例。
func canAddInput(AVCaptureInput!)
// 返回一个 boolean 值。指示着,指定的输入能否被添加到回话中。
func addInput(AVCaptureInput!)
// 添加一个给定的输入到会话(输出只能添加一个)
func removeInput(AVCaptureInput!)
// 移除指定的输入
var outputs: [Any]!
// 捕获对象的输出。 这个数组包含了 AVCaptureOutput 子类的实例。
func canAddOutput(AVCaptureOutput!)
// 返回一个 boolean 值。指示着,指定的输出能否被添加到回话中。
func addOutput(AVCaptureOutput!)
// 添加一个给定的输出到会话(输出只能添加一个)
func removeOutput(AVCaptureOutput!)
// 移除指定的输出
管理状态
func startRunning()
// 开始运行。 这个方法是开始从 inputs 到 outputs 的数据流的。 这个方法是一个同步方法,阻塞的。
// 这个方法的调用会直到 receiver 已经开始运行,或者运行失败。如果运行失败,你将你将收到一个 AVCaptureSessionRuntimeError 错误。
func stopRunning()
// 停止运行 (和 startRunning 类似)
var isRunning: Bool
// 是否正在运行
var isInterrupted: Bool
// 是否已经中断
配置更改
func beginConfiguration()
// 标识配置更改设置的开始。配置的改变能够自动生效。
// beginConfiguration() 和 commitConfiguration() 来进行批量的配置操作。配置的更改是原则性的(加锁的)
// 在调用 beginConfiguration 后, 你可以进行添加和删除输入和输出,更改 sessionPreset。
// 或配置个人捕获输入输出属性。 任何更改会在调用 commitConfiguration()后一起生效
func commitConfiguration()
// 参考 beginConfiguration()
回话管理的预设
var sessionPreset: String!
// 一个常量值,用来表明 output 的质量等级或者比特率。 默认值:AVCaptureSessionPresetHigh。
// 可以在 session 运行的时候来更改这个值。你只能设置一个预设如果canSetSessionPreset预设(_:)返回true。
// 可能的值 —— Video Input Presets
let AVCaptureSessionPresetPhoto: String
let AVCaptureSessionPresetHigh: String
let AVCaptureSessionPresetMedium: String
let AVCaptureSessionPresetLow: String
let AVCaptureSessionPreset320x240: String
let AVCaptureSessionPreset352x288: String
let AVCaptureSessionPreset640x480: String
func canSetSessionPreset(String!)
管理连接
func add(AVCaptureConnection!)
func canAdd(AVCaptureConnection!)
func addInputWithNoConnections(AVCaptureInput!)
func addOutputWithNoConnections(AVCaptureOutput!)
func remove(AVCaptureConnection!)