1. 程式人生 > >iOS-----AVFoundation框架的功能詳解

iOS-----AVFoundation框架的功能詳解

轉自:http://www.tuicool.com/articles/mE7zI3y

使用AVFoundation拍照和錄製視訊

需要開發自定義的拍照和錄製視訊功能,可藉助於AVFoundation框架來實現,該框架提供了大量的類來完成拍照和錄製視訊.主要使用如下類:

AVCaptureDevice :該物件代表物理輸入裝置,包括攝像頭和麥克風.開發者可通過該物件來配置底層物理裝置的屬性.需要指出的是,

我們不能直接建立該類的例項,只能通過該類的 devices、defaultDeviceWithMediaType:(NSString *)mediaType、

devicesWithMediaType:(NSString *)mediaType方法 來獲取對應的輸入裝置陣列,接下來即 可獲取前置攝像頭、後置攝像頭或麥克風,

程式就可設定該物件的對焦模式、閃光燈模式、曝光補償、白平衡 等各種拍照相關屬性。

注意:

在配置攝像頭的相關屬性之前,必須先呼叫lockForConfiguration:方法執行鎖定,配置完成後呼叫unlockForConfiguration方法解鎖。

AVCaptureSession :該物件負責把AVCaptureDevice捕捉得到的視訊或聲音資料輸出到輸出裝置中.不管執行實時的還是離線的錄製,開發者都必須建立AVCaptureSession物件,併為該物件新增輸入裝置(負責捕捉資料)和輸出端(負責接收資料).例如如下程式碼片段

AVCaptureDeviceInput [BL2]

 :它是AVCaptureInput的子類,使用該物件從AVCaptureDevice裝置獲取資料,該物件將會被新增給AVCaptureSession管理.

AVCaptureScreenInput [BL3] :它是AVCaptureInput的子類,使用該物件從螢幕獲取資料(用於錄製螢幕動作).該物件將會被新增給AVCaptureSeesion管理

AVCaptureAudioDataOutput、AVCaptureAudioPreviewOutput、AVCaptureFileOutput [BL4] 、AVCaptureStillImageOutput、AVCaptureVideoDataOutput:它們都是AVCaptureOutput的子類,用於接收各種資料.該物件也會被新增給AVCaptureSession管理.其中AVCaptureFileOutput依然代表輸出到檔案的輸出端,

AVCaptureAudioFileOutput [BL5] 、AVCaptureMovieFileOutput [BL6] :它們都是AVCaptureFileOutput的子類,分別代表輸出到音訊檔案、電影檔案的輸出端。

AVCaptureVideoPreviewLayer:該物件是CALayer的子類,開發者只要建立它的例項,併為它設定AVCaptureSession,就可以非常方便地用它來實現拍攝預覽.

使用AVFoundation實現拍照和錄製視訊的大致步驟如下

1

使用AVCaptureDevice的靜態方法獲取裝置,包括攝像頭和麥克風都可通過這種方式來獲取

2

利用AVCaptureDevice初始化AVCaptureDeviceInput物件,無論攝像頭還是麥克風都可通過這種方式轉換為AVCaptureInput物件

3

初始化輸出端.如果只是拍照,則初始化AVCaptureStillImageOutput輸出端即可;如果要捕捉視訊,則初始化AVCaptureMovieFileOutput輸出端.

4

建立AVCaptureSession物件,使用該物件來新增輸入裝置和輸出端.呼叫AVCaptureSession的startRunning方法開始捕捉畫面或聲音資料.

5

將捕捉的資料(照片、視訊資料)輸出到指定檔案。

框架

AVFoundation.framework框架,AssetsLibrary.framework,CoreMedia.framework框架

使用AVFoundation生成視訊縮圖

AVFoundation可用來生成視訊縮圖.

AVFoundation生成視訊縮圖主要靠如下兩個類.

AVURLAsset

該類是AVAsset的子類,AVAsset類專門用於獲取多媒體的相關資訊,包括獲取多媒體的畫面、聲音等資訊。而AVURLAsset子類的作用則是根據NSURL來初始化AVAsset物件。

AVAssetImageGenerator [BL7]

該類專門用於擷取視訊指定幀的畫面。

使用AVFoundation生成視訊縮圖的步驟如下:

1

根據視訊的NSURL建立AVURLAsset物件

2

根據AVURLAsset物件建立AVAssetImageGenerator物件

3

呼叫AVAssetImageGenerator物件的copyCGImageAtTime:actualTime:error:方法來獲取該視訊指定時間點的視訊截圖.該方法的第一個CMTime引數用於指定獲取哪個時間點的視訊截圖,第2個CMTime引數用於獲取實際截圖 位於哪個時間點.

其中CMTime是專門用於標識電影時間的結構體,通常用如下兩個函式來建立CMTime.

CMTimeMake(int64_t  value, int_32  timescale): 第1個引數代表獲取第幾幀的截圖,第2個引數代表每秒的幀數.因此實際擷取的時間點是value/timescale.

CMTimeMakeWithSeconds(Float64  seconds, int32_t  preferredTimeScale): 第1個引數代表獲取第幾秒的截圖,第2個引數則代表每秒的幀數.

程式碼片段

// 為增加UIImage增加一個類別,通過在該類別中為UIImage增加一個imageWithVideo:方法來獲取視訊的縮圖 

// UIImage + Video.m

@implementation UIImage (Video)

+ (UIImage *)imageWithVideo:(NSURL *)vidoURL

{

  // 根據視訊的URL建立AVURLAsset

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];

// 根據AVURLAsset建立AVAssetImageGenerator物件

 AVAssetImageGenerator* gen = [[AVAssetImageGenerator alloc] initWithAsset: asset];

 gen.appliesPreferredTrackTransform = YES;

 // 定義獲取0幀處的視訊截圖

CMTime time = CMTimeMake(0, 10);

 NSError *error = nil;

CMTime actualTime;

// 獲取time處的視訊截圖

CGImageRef  image = [gen  copyCGImageAtTime: time actualTime: &actualTime error:&error];

// 將CGImageRef轉換為UIImage

UIImage *thumb = [[UIImage alloc] initWithCGImage: image];

CGImageRelease(image);

return  thumb;

}

@end

 

ViewController.m

@interface ViewController: UIViewController

@property (nonatomic, strong) UIImageView *iv;

@end

 

@implementation ViewController

- (void)viewDidLoad

{

   [super viewDidLoad];

  // 獲取URL

   NSURL *videoUrl = [[NSBundle mainBundle]

URLForResource:@”movie” withExtension:@”mp4”];

   // 生成視訊的縮圖

   UIImage *image = [UIImage imageWithVideo:videoUrl];

   self.iv.image = image;

}

@end