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]
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
|