之前在 AVFoundation拍照和录像 中使用 AVCaptureMovieFileOutput类来捕捉 QuickTime影片,这个类定义了捕捉视频数据的简单方法。当对捕捉到的视频数据进行更底层的操作时,就需要用到 AVCaptureVideoDataOutput
AVCaptureVideoDataOutputSampleBufferDelegate
与AVCaptureMovieFileOutput的委托回调不同,AVCaptureVideoDataOutput的委托回调为AVCaptureVideoDataOutputSampleBufferDelegate
它定义了一下两个方法:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
- 每当有一个视频帧写入该方法就会被调用
- (void)captureOutput:(AVCaptureOutput *)captureOutput didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection NS_AVAILABLE(10_7, 6_0);
- 每当一个迟到的视频帧被丢弃时,就会被调用。通常是因为 在didOutputSampleBuffer中调用了耗时的操作。
CMSampleBufferRef
CMSampleBufferRef将基本的样本数据进行封装并提供格式和时间信息,还会家伙是哪个所有在转换和处理数据时用到的元数据。
- 样本数据 CVImageBufferRef
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
- 格式信息 CMFormatDescriptionRef
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
- 时间信息 CMTime
- 附加元数据
CMGetAttachment 获取
AVCaptureVideoDataOutput
配置
1 | - (BOOL)setupSessionOutputs:(NSError **)error { |
OpenGL ES处理数据,将视频数据贴在立方体上
OpenGL ES 参考
Apple guide - About OpenGl ES
OpenGL Tutorial for iOS: OpenGL ES 2.0
OpenGL ES 2.0 iOS教程
创建CVOpenGLESTextureCacheCreate
1 |
|
创建OpenGL ES贴图
1 |
|