AV Foundation简单入门之一

通过《AVFoundation》这篇文章,我们对AV Foundation框架有了一些初步了解,下面我们就在此基础上一步步的看一下这个框架的基本使用吧。

使用AV Foundation的时机

  • 跨平台的媒体数据处理
  • 对性能要求较高,并需要与高层的Media Player、Assets Library或底层的Core Media、Core Audio交互时,以OC的方式实现而非C Api。

AV Foundation是苹果OS X和iOS系统中用于处理基于时间的媒体数据的高级Objective-C的高级框架,是针对64位系统设备设计的,可以发挥64位的所有优势;充分利用了多核的优势并大量使用了Block&GCD机制将复杂的计算过程放在了后台线程运行,会自动提供硬件的加速要求,确保在大部分的应用上高速运行。AV Foundation的设计也充分考虑了电量效率来满足如Iphone和Ipad的诸类的移动设备对电量的要求。

代码示例

AVSpeechSynthesizer类可以使我们方便的在cocoa添加文本语音的功能

运行便可听到语音。

其实,就是这么简单。

AV Foundation捕捉视频的类与子类

媒体捕捉不支持模拟器,也不能同时使用iOS设备上的前置摄像头和后置摄像头进行捕捉。

  • AVCaptureDevice 代表了输入设备,例如摄像头与麦克风。
  • AVCaptureInput 代表了输入数据源
  • AVCaptureOutput 代表了输出数据源
  • AVCaptureSession 用于协调输入与输出之间的数据流
  • AVCaptureConnection 是一个连接,这个连接是inputPort和output之间或者是图像当前预览层和当前会话之间的。
  • AVCaptureVideoPreviewLayer 提供摄像头的预览功能,照片以及视频的显示就是通过把这个对象添加到UIView 的layer上的。

不能直接创建AVCaptureDevice的实例,只能通过该类的 devices、defaultDeviceWithMediaType:(NSString )mediaType、devicesWithMediaType:(NSString )mediaType方法 来获取对应的输入设备数组,接下来即 可获取前置摄像头、后置摄像头或麦克风,程序就可设置该对象的对焦模式、闪光灯模式、曝光补偿、白平衡 等各种拍照相关属性。在配置摄像头的相关属性之前,必须先调用lockForConfiguration:方法执行锁定,配置完成后调用unlockForConfiguration方法解锁。

AVCaptureInput根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,从AVCaptureDevice设备获取数据,该对象将会被添加到AVCaptureSession中管理。它配置抽象硬件设备的ports。AVCaptureScreenInput 可以从屏幕获取数据(用于录制屏幕动作),会被添加给AVCaptureSeesion管理。

AVCaptureOutput输出的可以是图片(AVCaptureStillImageOutput)或者视频(AVCaptureMovieFileOutput)。AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput它们都是AVCaptureOutput的子类,用于接收各种数据。该对象也会被添加给AVCaptureSession管理,其中AVCaptureFileOutput依然代表输出到文件的输出端。AVCaptureAudioFileOutput、AVCaptureMovieFileOutput 分别代表输出到音频文件、电影文件的输出端。

对于一个AVCaptureSession, 可以配置多个inputs和outputs。每个session称之为一个会话,也就是在应用运行过程中如果你需要改变会话的一些配置(例如:切换摄像头),此时需要先开启配置,配置完成之后再提交配置。有些情况下, 会涉及到如何表示一个inputs的多个端口(ports), 以及这些ports如何连接到outputs的问题。AVCaptureSession中使用 AVCaptureConnection 表示inputs和outputs之间的连接,一个Inputs包含一个或多个input ports( AVCaptureInputPort ), Outputs可以从一个或多个来源接收数据,比如 AVCaptureMovieFileOutput 可以同时接收视频和音频数据。在AVCaptureSession中添加一个input或output时,AVCaptureSession会为所有可匹配的inputs和outputs之前生成connections( AVCaptureConnection )。可以使用一个connection来开启或关闭一个input或output数据流,也可以使用connection监控一个audio频道的码率平均值和峰值。它有startRunning和stopRunning两种方法来开启会话和结束会话。

可以使用AVCaptureSession的 sessionPreset 属性指定图片质量和分辨率:

  • AVCaptureSessionPresetHigh: 高分辨率, 最终效果根据设备不同有所差异
  • AVCaptureSessionPresetMedium: 中等分辨率, 适合Wi-Fi分享. 最终效果根据设备不同有所差异
  • AVCaptureSessionPresetLow: 低分辨率, 适合3G分享, 最终效果根据设备不同有所差异
  • AVCaptureSessionPreset640x480: 640×480, VGA
  • AVCaptureSessionPreset1280x720: 1280×720, 720p HD
  • AVCaptureSessionPresetPhoto: 全屏照片, 不能用来作为输出视频

闲话少说,上代码:

利用AVFoundation拍照的步骤如下:
1)创建AVCaptureSession对象
2)使用AVCaptureDevice的静态方法获得需要使用的设备。拍照和录像需要使用摄像头,录音就需要使用麦克风设备。
3)利用输入设备AVCaptureDevice初始化AVCaptureDeviceInput对象。
4)初始化输出设备管理对象,如果要拍照就初始化AVCaptureStillImageOutput对象;如果拍摄视频就初始化AVCaptureMovieFileOutput对象。
5)将数据输入对象AVCaptureDeviceInput和数据输出对象AVCaptureOutput添加到AVCaptureSession中去。
6)创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示器中,调用AVCaptureSession中的stratRunning方法开始捕获图像。
7)将捕获的音视频文件输出到指定文件。

如此,一个拍照的功能就简单实现了。下一篇我们将实现一些更复杂的逻辑。

1170656-3a711dfaa735f106
1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部