1. AVFoundation简介
AVFoundation 是 OSX 系统和 iOS 系统中用于处理基于时间的媒体数据的高级框架,AVFoundation的设计过程高度依赖多线程机制,充分利用多核硬件优势,大量使用 Block 和 GCD 机制将运算任务放在子线程,且提供硬件加速确保最佳性能。
简单说如果你的应用程序需要使用到高级媒体捕捉、媒体编辑可以使用 AVFoundation 来完成。
AVFoundation 框架在iOS的架构如下:
使用AVKit框架即可实现简单的视频文件播放。
UIImagePickerController可以实现简单的拍照以及视频录制。
2. 视频捕捉
AVFoundation框架内容比较多的,这里通过视频捕捉来入门AVFoundation。如果想深入学习,可以进入官网:
苹果官方AVFoundation框架介绍
AVFoundation框架
推荐阅读《AVFoundation 开发秘籍》
视频流捕捉框架图如下:
整体由输入、输出、会话层、连接、设备组成。对于每一个部分都有相应的类,下面分别介绍这几个类,后面会有实践。
3. AVCaptureSession
AVCaptureSession 是视频捕获的核心类,对应于框架中的capture session。它主用于管理输入输出,开始和停止捕获等,同时还可以设置输出数据的质量与格式。常用的方法和属性如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| @property(nonatomic, copy) AVCaptureSessionPreset sessionPreset;
- (BOOL)canSetSessionPreset:(AVCaptureSessionPreset)preset;
@property(nonatomic, readonly) NSArray<__kindof AVCaptureInput *> *inputs;
- (BOOL)canAddInput:(AVCaptureInput *)input;
- (void)addInput:(AVCaptureInput *)input;
- (void)removeInput:(AVCaptureInput *)input;
@property(nonatomic, readonly) NSArray<__kindof AVCaptureOutput *> *outputs;
- (BOOL)canAddOutput:(AVCaptureOutput *)output;
- (void)addOutput:(AVCaptureOutput *)output;
- (void)removeOutput:(AVCaptureOutput *)output;
- (void)beginConfiguration; - (void)commitConfiguration;
- (void)startRunning; - (void)stopRunning;
|
同时还提供一些通知,让开发者可以获取该兴趣的信息。
AVCaptureSessionRuntimeErrorNotification
AVCaptureSessionDidStartRunningNotification
AVCaptureSessionDidStopRunningNotification
AVCaptureSessionWasInterruptedNotification
AVCaptureSessionInterruptionEndedNotification
4. AVCaptureDevice
AVCaptureDevice 表示提供实时输入媒体数据(如视频和音频)的物理设备。该类是不能直接初始化的。devicesWithMediaType、devices 等方法均已被 AVCaptureDeviceDiscoverySession 替代,我们应当使用 AVCaptureDeviceDiscoverySession 类来获取设备。
下面是常用的一些属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @property(nonatomic, readonly) AVCaptureDevicePosition position;
- (BOOL)lockForConfiguration:(NSError * _Nullable * _Nullable)outError; - (void)unlockForConfiguration;
- (BOOL)isTorchModeSupported:(AVCaptureTorchMode)torchMode;
@property(nonatomic) AVCaptureTorchMode torchMode;
- (BOOL)isFocusModeSupported:(AVCaptureFocusMode)focusMode;
@property(nonatomic) AVCaptureFocusMode focusMode;
@property(nonatomic, readonly, getter=isFocusPointOfInterestSupported) BOOL focusPointOfInterestSupported;
@property(nonatomic) CGPoint focusPointOfInterest;
+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType;
+ (void)requestAccessForMediaType:(NSString *)mediaType completionHandler:(void (^)(BOOL granted))handler;
|
我们不能直接使用 AVCaptureDevice 作为输入,而是需要使用 AVCaptureDeviceInput 封装 AVCaptureDevice。AVCaptureDeviceInput是 AVCaptureInput的子类。
AVCaptureInput 的子类还有AVCaptureScreenInput和AVCaptureScreenInput
AVCaptureScreenInput 仅用于 OS X,对应屏幕的输入,如录屏
AVCaptureScreenInput 仅连接AVCaptureMovieFileOutput输出,可以算是一个附加输入
因此我们学会使用 AVCaptureDeviceInput 即可,常用方法和属性如下:
1 2 3 4 5 6
| @property(nonatomic, readonly) AVCaptureDevice *device;
- (nullable instancetype)initWithDevice:(AVCaptureDevice *)device error:(NSError * _Nullable * _Nullable)outError;
|
6. AVCaptureOutput
AVCaptureOutput 对应输出的类,其是一个抽象类,我们需要使用其子类。
AVCaptureFileOutput: 文件数据输出,用于记录,如录视频和录音。
AVCaptureMovieFileOutput: AVCaptureFileOutput的子类,视频文件数据输出,连接的输入有音频输入和视频输入
AVCaptureAudioFileOutput: AVCaptureFileOutput的子类,音频文件数据输出,连接的输入有音频输入
以下是实时数据输出,可实时处理
AVCaptureVideoDataOutput: 视频数据输出,连接视频输入
AVCaptureMetadataOutput: 视频元数据输出,连接视频输入
AVCaptureAudioDataOutput: 音频数据输出,连接音频输入
AVCapturePhotoOutput: 照片数据输出,连接视频输入
AVCaptureStillImageOutput: (原照片数据输出吗,已被废弃)
因为主要是视频捕获,下面介绍一下 AVCaptureMovieFileOutput、AVCaptureVideoDataOutput、AVCapturePhotoOutput。(AVCaptureMetadataOutput在后面进阶中介绍)
7. AVCaptureMovieFileOutput
AVCaptureMovieFileOutput 用于录制视频,其中有详细信息的元数据。
元数据:保存音视频等多媒体资料的各种附加信息。如:作者, 标题, 创建时间, 封面等描述关于这个多媒体的一些常见描述信息。
常用方法和属性如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @property(nonatomic, readonly) CMTime recordedDuration; @property(nonatomic, readonly) int64_t recordedFileSize;
@property(nonatomic) CMTime maxRecordedDuration; @property(nonatomic) int64_t maxRecordedFileSize;
- (void)stopRecording;
- (void)startRecordingToOutputFileURL:(NSURL *)outputFileURL recordingDelegate:(id<AVCaptureFileOutputRecordingDelegate>)delegate;
|
8. AVCaptureVideoDataOutput
AVCaptureVideoDataOutput 主要是需要处理实时视频数据时使用,例如想要实现实时视频帧处理、追踪、译码等均可以在这里处理。下面介绍一下常用方法和属性。
1 2 3 4 5 6
| @property(nonatomic, copy, null_resettable) NSDictionary<NSString *, id> *videoSettings;
- (void)setSampleBufferDelegate:(nullable id<AVCaptureVideoDataOutputSampleBufferDelegate>)sampleBufferDelegate queue:(nullable dispatch_queue_t)sampleBufferCallbackQueue;
|
9. AVCapturePhotoOutput
AVCapturePhotoOutput 取代了 AVCaptureStillImageOutput 来获取照片。AVCapturePhotoOutput的功能更加强大,支持简JPEG图片拍摄、Live照片、RAW格式拍摄等,也有双摄以及人像模式等。下面是常用的方法与属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @property(nonatomic, readonly) NSArray<AVCapturePhotoSettings *> *preparedPhotoSettingsArray
@property(nonatomic, readonly) NSArray<NSNumber *> *availablePhotoPixelFormatTypes;
@property(nonatomic, readonly) NSArray<AVVideoCodecType> *availablePhotoCodecTypes;
- (void)capturePhotoWithSettings:(AVCapturePhotoSettings *)settings delegate:(id<AVCapturePhotoCaptureDelegate>)delegate;
- (void)setPreparedPhotoSettingsArray:(NSArray<AVCapturePhotoSettings *> *)preparedPhotoSettingsArray completionHandler:(nullable void (^)(BOOL prepared, NSError * _Nullable error))completionHandler;
|
10. 总结
AVFoundation 框架内容很多,因此我是以视频捕捉作为入门和实践,所以仅介绍重点类和常用方法与属性,另外在现在这个快餐时代,写太多了,人会产生一种不耐烦的心情,不会专心读不下去,即使看下去了,也不一定能记住,因此短篇足够。
纸上得来终觉浅,绝知此事要躬行。下一章会实践篇,来构建一个可以拍视频和拍照的相机,会把使用到的地方细讲。
瑞思拜~