AVFoundation视频流的捕捉:
要捕捉视频需要这几个类:
AVCaptureDevice 代表了输入设备,例如摄像头与麦克风。
AVCaptureInput 代表了输入数据源
AVCaptureOutput 代表了输出数据源
AVCaptureSession 用于协调输入与输出之间的数据流
AVCaptureVideoPreviewLayer 提供摄像头的预览功能
具体的步骤:
1.创建AVCaputureSession。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
span.s1 { }
span.s2 { color: #000000 }
span.s3 { color: #3d1d81 }
AVCaptureSession * session = [[AVCaptureSession alloc]init];
2.创建AVCaptureDevice:
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
span.s1 { }
span.s2 { color: #000000 }
span.s3 { color: #3d1d81 }
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
3.创建AVCaptureDeviceInput,并添加到Session中:
我们需要使用AVCaptureDeviceInput来让设备添加到session中, AVCaptureDeviceInput负责管理设备端口。我们可以理解它为设备的抽象。一个设备可能可以同时提供视频和音频的捕捉。我们可以分别用AVCaptureDeviceInput来代表视频输入和音频输入。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
span.s1 { color: #703daa }
span.s2 { }
span.s3 { color: #000000 }
span.s4 { color: #3d1d81 }
NSError * error;
AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
4.创建AVCaptureOutput: 线程必须是串行的,确保视频帧按序到达。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3d1d81 }
span.s1 { }
span.s2 { color: #000000 }
span.s3 { color: #3d1d81 }
span.s4 { color: #bb2ca2 }
span.s5 { color: #272ad8 }
AVCaptureVideoDataOutput * output = [[AVCaptureVideoDataOutput alloc]init];
[session addOutput:output];
[output setSampleBufferDelegate:self queue:dispatch_get_global_queue(0, 0)];
5.开始捕捉
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3d1d81 }
span.s1 { color: #000000 }
span.s2 { }
[session startRunning];
6.在AVCaptureVideoDataOutputSampleBufferDelegate代理方法中进行视频流的分析
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo }
span.s1 { }
span.s2 { color: #bb2ca2 }
span.s3 { color: #703daa }
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
}
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
span.s1 { }