




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯iOS 6 Programming Cookbook第 13 章照相機(jī)和圖片庫翻譯時(shí)間:2013-03-31DevDiv 熱心網(wǎng)友自發(fā)組織翻譯DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日1iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯寫在前面 iOS 6 Programming Cookbook 是 OReilly 出版社出版,作者是 Vandad Nahavandipoor。在這里希望大家尊重原創(chuàng),尊重知識(shí)版權(quán),此次翻譯是 De
2、vDiv 熱情網(wǎng)友感覺此書還行,便自發(fā)組織翻譯,并無償分享給廣大 iOS 開發(fā)者。內(nèi)容僅供交流學(xué)習(xí)使用,切勿商用或者其它一切用途。如果你覺得內(nèi)容可以的話,請(qǐng)主動(dòng)到官網(wǎng)進(jìn)行購買:嚴(yán)重警告:限下載后 24 小時(shí)內(nèi)刪除DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日2iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯目錄寫在前面2目錄3第 13 章 照相機(jī)和圖片庫5 1.0. 介紹5 1.1. 檢測(cè)和研究攝像頭6 1.1.1. 問題 6 1.1.2. 方案 6 1.1.3. 討論 7 1.2. 利用攝像頭進(jìn)行拍照10 1.2.1
3、. 問題 10 1.2.2. 方案 10 1.2.3. 討論 11 1.2.4. 參考 12 1.3. 利用攝像頭進(jìn)行視頻的錄制12 1.3.1. 問題 12 1.3.2. 方案 13 1.3.3. 討論 14 1.3.4. 參考 14 1.4. 把圖片存儲(chǔ)在多媒體庫中15 1.4.1. 問題 15 1.4.2. 方案 15 1.4.3. 討論 16 1.5. 把視頻錄像文件保存在多媒體庫中 1.5.1. 問題 16 1.5.2. 方案 17 1.5.3. 討論 17 1.6. 從多媒體庫中獲得圖片和視頻 18 1.6.1. 問題 18 1.6.2. 方案 18 1.6.3. 討論 19 1.
4、6.4. 參考 19 1.7. 從資源庫中直接獲取資源19 1.7.1. 問題 19 1.7.2. 方案 19 1.7.3. 討論 21 1.8. 在 iOS 設(shè)備中編輯視頻 24 1.8.1. 問題 24 1.8.2. 方案 24 1.8.3. 討論 24 1.8.4. 參考 2716DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日3iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日4iOS 6 Programming CookbookD
5、evDiv 熱心網(wǎng)友自發(fā)組織翻譯第 13 章 照相機(jī)和圖片庫1.0. 介紹 目前一些 iOS 的設(shè)備都是帶有攝像頭的,例如 iPhone5 有前后兩個(gè)攝像頭,iPhone3G 和iPhone3GS 是 有 一 個(gè) 攝 像 頭 , 而 有 些 是 沒 有 帶 攝 像 頭 的 , 比 如 說 iPhone 第 一 代 。UIImagePickerController 這個(gè)類可以為大家提供照相,視頻錄制功能。 本章中,你想學(xué)到如何照相和錄制視頻,以及訪問這些照片和視頻。并且知道如何訪問iOS 設(shè)備(如 iPod 和 iPad)中圖片庫中的圖片和視頻。iOS 模擬器不支持照相功能,因此如果我們需要測(cè)試
6、這一類的程序時(shí)我們需要連接到真機(jī)。本章中,我們首先需要判斷一下 iOS 設(shè)備中的攝像頭是否可用。也可以判斷攝像頭是否允許你來拍照或者錄制視頻。為了完成這個(gè)需求,需要將 MobileCoreServices.framework 框架添加到 target 中,如下步驟:1、在 Xcode 上點(diǎn)擊你的工程圖標(biāo);2、選擇需要添加 framework 的 targett;3、在屏幕的頂部選擇 Build Phases 標(biāo)簽欄;4、在 Biuld Phase 標(biāo)簽里,使用 Libraries box 尋找可拓展 Link Binary 并按下“+” 按鈕;5、在顯示出來的列表中,選擇 AddressBoo
7、k6、點(diǎn)擊“Add”按鈕我們來看一下另外一個(gè)主題:訪問 iOS 設(shè)備中不同相冊(cè)里面的圖片和視頻。訪問相冊(cè)中的圖片要比視頻更直接簡(jiǎn)單。針對(duì)圖片,我們將給出圖片的地址,然后就可以簡(jiǎn)單的將圖片數(shù)據(jù)加載到 NSData 實(shí)例對(duì)象中,或者 UIImage 實(shí)例對(duì)象中。針對(duì)視頻,我們并不指定一個(gè)文件地址來加載視頻。而是給出如下這樣的地址:assets-library:/asset/asset.MOV?id=1000000004&ext=MOV 針對(duì)這樣的地址,我們需要使用 Assets Library 框架。Assets Library 框架運(yùn)行我們通過Photos 程序來訪問內(nèi)容,包括用戶采集到的圖片和
8、視頻。這些圖片和視頻也能夠被 PhotoLibrary 訪問。 為了確保本章中的代碼示例能夠正確編譯,需要按照下面的步驟將 Assets Library 框架添加到 target 中: 1、在 Xcode 上點(diǎn)擊你的工程圖標(biāo); 2、選擇需要添加 framework 的 targett; 3、在屏幕的頂部選擇 Build Phases 標(biāo)簽欄; 4、在 Biuld Phase 標(biāo)簽里,使用 Libraries box 尋找可拓展 Link Binary 并按下“+”DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日5iOS 6 Programming Cookb
9、ook 按鈕;5、在顯示出來的列表中,選擇 AssetsLibrary6、點(diǎn)擊“Add”按鈕DevDiv 熱心網(wǎng)友自發(fā)組織翻譯 為了訪問給定的 URL 數(shù)據(jù),需要按照如下步驟進(jìn)行: 1、分配和初始化一個(gè) ALAssetsLibrary 對(duì)象。Assets Library 對(duì)象能夠幫助你通過 Photos程序訪問視頻和圖片. 2、使用 ALAssetsLibrary 的 assetForURL:resultBlock:failureBlock 實(shí)例方法來訪問資源。這個(gè)資源可以是圖片,視頻,或者今后蘋果決定添加到 Photo 庫中的其它資源。這個(gè)方法是與 block 一起使用的。更多關(guān)于 bloc
10、k 對(duì)象和 GCD,請(qǐng)參考第六章。 3、release 調(diào)第一步中創(chuàng)建的對(duì)象。 至 此 , 你 可 能 在 考 慮 : 我 如 何 訪 問 資 源 中 的 數(shù) 據(jù) ? ALAssetsLibrary 的assetForURL:resultBlock:failureBlock 實(shí)例方法的參數(shù) resultBlock 需要指向一個(gè) block 對(duì)象,這個(gè) block 對(duì)象接收一個(gè) ALAsset 類型的參數(shù)。通過 ALAsset 就可以訪問圖片和視頻了。更多關(guān)于在 Photo 庫中存儲(chǔ)圖片和視頻請(qǐng)參考 13.4 和 13.5 小節(jié)。如果你希望學(xué)習(xí)從 Photo 庫和 Assets 庫中檢索圖片和視
11、頻,請(qǐng)參考 13.6 和 13.7 小節(jié)。1.1. 檢測(cè)和研究攝像頭1.1.1.問題你想檢測(cè)一下設(shè)備是否有你可以訪問的攝像頭。在使用攝像頭之前,進(jìn)行這樣的檢測(cè)是非常重要的,除非你能確定你的程序永遠(yuǎn)都不會(huì)運(yùn)行在沒有攝像頭的設(shè)備中。1.1.2.方案 通 過 UIImagePickerController 的 isSourceTypeAvailable 這個(gè) 方法進(jìn)行 檢測(cè),并傳遞UIImagePickerControllerSourceTypeCamera 這個(gè)參數(shù)進(jìn)去。代碼如下- (BOOL) isCameraAvailablereturn UIImagePickerController isS
12、ourceTypeAvailable:UIImagePickerControllerSourceTypeCamera;- (BOOL) application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptionsif (self isCameraAvailable)NSLog(Camera is available.); else NSLog(Camera is not available.);self.window = UIWindow alloc initWithFra
13、me:UIScreen mainScreen bounds;self.window.backgroundColor = UIColor whiteColor;self.window makeKeyAndVisible;return YES;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日6iOS 6 Programming Cookbook1.1.3.討論DevDiv 熱心網(wǎng)友自發(fā)組織翻譯 當(dāng)使用 UIImagePickerController 個(gè)類來進(jìn)行類似拍照,錄像的功能的時(shí)候,你就必須要對(duì)攝像頭的存在與否進(jìn)行檢測(cè)。通過 isSourceTypeAvai
14、lable 這個(gè)方法,能夠?qū)θN數(shù)據(jù)進(jìn)行檢查。1. 攝像頭的功能,通過給這個(gè)方法傳遞 UIImagePickerControllerSourceTypeCamera 這個(gè)值2. 圖片庫,通過傳遞 UIImagePickerControllerSourceTypePhotoLibrary 這個(gè)對(duì)象。這個(gè)時(shí)候 是打開了照相目錄的頂層目錄3. 列表形式的瀏覽目錄,通過傳遞 UIImagePickerControllerSourceTypeSavedPhotosAlbum 這 個(gè)值。 如果你想檢測(cè)如上的任何一個(gè)功能是否能夠使用,那么你就必須要傳遞不同的參數(shù)。下面讓我們看一下具體的代碼改如何實(shí)現(xiàn),我在
15、app delegate 頭文件中導(dǎo)入框架的頭文件。#import #import #import interface Detecting_and_Probing_the_CameraAppDelegate: UIResponder property (strong, nonatomic) UIWindow *window;end現(xiàn)在我們可以使用isSourceTypeAvailable:和availableMediaTypesForSourceType:方法來判斷媒體資源是否可用(攝像頭、Photo庫等)。- (BOOL) cameraSupportsMedia:(NSString *)pa
16、ramMediaTypesourceType:(UIImagePickerControllerSourceType)paramSourceType_block BOOL result = NO;if (paramMediaType length = 0)NSLog(Media type is empty.);return NO;NSArray *availableMediaTypes =UIImagePickerController availableMediaTypesForSourceType:paramSourceType;availableMediaTypes enumerateObj
17、ectsUsingBlock:(id obj, NSUInteger idx, BOOL *stop) NSString *mediaType = (NSString *)obj;if (mediaType isEqualToString:paramMediaType)result = YES;*stop= YES;return result;- (BOOL) doesCameraSupportShootingVideosreturn self cameraSupportsMedia:(_bridge NSString *)kUTTypeMoviesourceType:UIImagePicke
18、rControllerSourceTypeCamera;- (BOOL) doesCameraSupportTakingPhotosreturn self cameraSupportsMedia:(_bridge NSString *)kUTTypeImagesourceType:UIImagePickerControllerSourceTypeCamera;- (BOOL) application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptionsif (self do
19、esCameraSupportTakingPhotos)DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日7iOS 6 Programming CookbookNSLog(The camera supports taking photos.); else NSLog(The camera does not support taking photos);if (self doesCameraSupportShootingVideos)NSLog(The camera supports shooting videos.); else NSLog(The camer
20、a does not support shooting videos.);self.window = UIWindow alloc initWithFrame:UIScreen mainScreen bounds;self.window.backgroundColor = UIColor whiteColor;self.window makeKeyAndVisible;return YES;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯注意:我們使用_bridge 將 KUTTypeMovie 和 KUTTypeImage 轉(zhuǎn)換為 NSString。但是有些是有,有些 iOS 設(shè)備是有超過一個(gè)攝像頭的,為
21、了檢測(cè)所有的攝像頭是否都能正常功能做,那么你就需要使用 isCameraDeviceAvailable 這個(gè)方法了,代碼如下。- (BOOL) isFrontCameraAvailablereturn UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront;- (BOOL) isRearCameraAvailablereturn UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCame
22、raDeviceRear; 當(dāng) 在 比 較 老的 沒 有 前置 攝 像 頭的 設(shè) 備 中,你 將 會(huì) 看 到 isFrontCameraAvailable , 和isRearCameraAvailable 的值分別是 YES 和 NO。當(dāng)你在 iphone4S 中測(cè)試的時(shí)候,發(fā)覺前后攝像頭都是 YES 的。 如果單純的檢測(cè)攝像頭是否可用不能滿足于你的程序,你可以使用UIImagePickerController 類來獲取其它一些設(shè)置。其中一個(gè)設(shè)置就是是否支持閃光燈。請(qǐng)記住,UIImagePickerController 的 isFlashAvailableForCameraDevice:類方法
23、在檢查是否支持閃光燈之前,會(huì)首先檢查一下攝像頭是否可用。因此在運(yùn)行這個(gè)函數(shù)時(shí),不需要首先對(duì)攝像頭可用進(jìn)行檢查。- (BOOL) isFlashAvailableOnFrontCamerareturn UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceFront;- (BOOL) isFlashAvailableOnRearCamerareturn UIImagePickerController isFlashAvailableForCameraDevice:UII
24、magePickerControllerCameraDeviceRear;現(xiàn)在我們?nèi)绻覀儗⒈竟?jié)中介紹的所有方法利用起來,并在 app delegate 中進(jìn)行測(cè)試,那么我們會(huì)在不同設(shè)備上看到不同的結(jié)果:- (BOOL) application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptionsif (self isFrontCameraAvailable)DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日8iOS 6 Programmi
25、ng CookbookNSLog(The front camera is available.);if (self isFlashAvailableOnFrontCamera)NSLog(The front camera is equipped with a flash); else NSLog(The front camera is not equipped with a flash); else NSLog(The front camera is not available.);if (self isRearCameraAvailable)NSLog(The rear camera is
26、available.);if (self isFlashAvailableOnRearCamera)NSLog(The rear camera is equipped with a flash); else NSLog(The rear camera is not equipped with a flash); else NSLog(The rear camera is not available.);if (self doesCameraSupportTakingPhotos)NSLog(The camera supports taking photos.); else NSLog(The
27、camera does not support taking photos);if (self doesCameraSupportShootingVideos)NSLog(The camera supports shooting videos.); else NSLog(The camera does not support shooting videos.);self.window = UIWindow alloc initWithFrame:UIScreen mainScreen bounds;self.window.backgroundColor = UIColor whiteColor
28、;self.window makeKeyAndVisible;return YES;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯如上代碼執(zhí)行之后,將會(huì)打印如下效果。(iPhone4)The front camera is available.The front camera is not equipped with a flashThe rear camera is available.The rear camera is equipped with a flashThe camera supports taking photos.The camera supports shooting videos.
29、如上代碼執(zhí)行之后,將會(huì)打印如下效果。(3GS)The front camera is not available.The rear camera is available.The rear camera is not equipped with a flashThe camera supports taking photos.The camera supports shooting videos.如上代碼執(zhí)行之后,將會(huì)打印如下效果。(第一代 iPad)The front camera is not available.DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月
30、17 日9iOS 6 Programming CookbookThe rear camera is not available.The camera does not support taking photosThe camera does not support shooting videosDevDiv 熱心網(wǎng)友自發(fā)組織翻譯如上代碼執(zhí)行之后,將會(huì)打印如下效果。(第二代 iPad)The front camera is available.The front camera is not equipped with a flashThe rear camera is available.The
31、 rear camera is not equipped with a flashThe camera supports taking photos.The camera supports shooting videos.1.2. 利用攝像頭進(jìn)行拍照1.2.1.問題你希望用戶能通過攝像頭拍照,并能夠訪問剛剛拍攝的這張相片。1.2.2.方案 實(shí)例化 UIImagePickerController 這個(gè)類,然后在當(dāng)前 view control 上以模態(tài)方式將這個(gè)view control 顯示出來。下面是 view control 的頭文件:#import #import #import inter
32、face Taking_Photos_with_the_CameraViewController: UIViewController end UIImagePickerController 作為 UIImagePickerController 的 delegate,必須要遵循UINavigationControllerDelegate 和 UIImagePickerControllerDelegate 這兩個(gè)協(xié)議類。如果你忘記在你的頭文件中添加這兩個(gè)協(xié)議對(duì)象。那么在你將這個(gè) view control 賦值給UIImagePickerController 的 delegate 時(shí),你將會(huì)在編譯的
33、時(shí)候有一堆的警告。請(qǐng)記住,如果你的對(duì)象沒有名且的遵循 UINavigationControllerDelegate 和UIImagePickerControllerDelegate 協(xié)議,你任然可以將對(duì)象賦值給 UIImagePickerController 的delegate,只不過你需要實(shí)現(xiàn)協(xié)議中必須實(shí)現(xiàn)的方法。不過我還是建議你在頭文件中包含需要用到的協(xié)議,這樣可以避免編譯器的相關(guān)警告。 在 view control 的實(shí)現(xiàn)文件中,我將嘗試以模態(tài)的方式顯示出 image picker control,如下:- (void)viewDidLoadsuper viewDidLoad;if (s
34、elf isCameraAvailable &self doesCameraSupportTakingPhotos)UIImagePickerController *controller =UIImagePickerController alloc init;controller.sourceType = UIImagePickerControllerSourceTypeCamera;NSString *requiredMediaType = (_bridge NSString *)kUTTypeImage;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日1
35、0iOS 6 Programming Cookbookcontroller.mediaTypes = NSArray allocinitWithObjects:requiredMediaType, nil;controller.allowsEditing = YES;controller.delegate = self;self.navigationController presentModalViewController:controlleranimated:YES; else NSLog(Camera is not available.);DevDiv 熱心網(wǎng)友自發(fā)組織翻譯我們?cè)谌缟系拇a
36、中使用了 isCameraAvailable 和 doesCameraSupportTaking這兩個(gè)方法,關(guān)于這兩個(gè)方法的實(shí)現(xiàn)請(qǐng)參考 13.1 中的介紹。 在上面的示例中,我們?cè)试S用戶使用 image picker 獲取一張照片。你可能已經(jīng)注意到,我將 image picker 的 delegate 屬性設(shè)置為 self,也就是 view control。為此,我們必須要實(shí)現(xiàn)UIImagePickerControllerDelegate 中定義的方法:- (void) imagePickerController:(UIImagePickerController *)pickerdidFini
37、shPickingMediaWithInfo:(NSDictionary *)infoNSLog(Picker returned successfully.);NSString *mediaType = info objectForKey:UIImagePickerControllerMediaType;if (mediaType isEqualToString:(_bridge NSString *)kUTTypeMovie)NSURL *urlOfVideo =info objectForKey:UIImagePickerControllerMediaURL;NSLog(Video URL
38、 = %, urlOfVideo);else if (mediaType isEqualToString:(_bridge NSString *)kUTTypeImage)/* Lets get the metadata. This is only forimages. Not videos */NSDictionary *metadata =info objectForKey:UIImagePickerControllerMediaMetadata;UIImage *theImage =info objectForKey:UIImagePickerControllerOriginalImag
39、e;NSLog(Image Metadata = %, metadata);NSLog(Image = %, theImage);picker dismissModalViewControllerAnimated:YES;- (void)imagePickerControllerDidCancel:(UIImagePickerController *)pickerNSLog(Picker was cancelled);picker dismissModalViewControllerAnimated:YES;1.2.3.討論 關(guān)于 picker control 的 delegate 我們需要注
40、意幾個(gè)問題,首先,首先就是 image pickercontrol 調(diào)用的兩個(gè) delegate 方法。當(dāng)用戶完成照片選取后,會(huì)調(diào)用DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日11iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯imagePickerController:didFinishPickingMediaWithInfo:方法。而當(dāng)用戶取消時(shí),則會(huì)調(diào)用imagePickerController:DidCancel:方法。 并且在 imagePickerController:didFinishPickingMe
41、diaWithInfo:方法中包含了用戶獲得的內(nèi)容,是一個(gè)圖片或者視頻。didFinishPickingMediaWithInfo 這個(gè)參數(shù)是一個(gè)字典,告訴你選取的圖片,已經(jīng)想過元數(shù)據(jù),以及其它一些有用的信息。在這個(gè)方法中你首先必須要做的就是讀取出字典中 UIImagePickerControllerMediaType 鍵對(duì)應(yīng)的值。值的類型為 NSString,值的內(nèi)容可能是如下兩個(gè)之一: kUTTypeImage 通過攝像頭拍攝的一個(gè)圖片 kUTTypeMovie 通過攝像頭拍攝的一個(gè)視頻 注意:kUTTypeImage 和 kUTTypeMovie 值是在 Mobile Core Serv
42、ices 框架中可用,并且類型為 CFStringRef 類型。如果需要,你可以將其轉(zhuǎn)換為 NSString。 在知道通過攝像頭獲得的資源類型之后(視頻或圖片),就可以使用didFinishPickingMediaWithInfo 字典參數(shù)訪問資源屬性了。 如果是圖片(kUTTypeImage)的話,可以訪問的 key 如下: UIImagePickerControllerMediaMetadata 這個(gè) key 的值類型為 NSDictionary。這個(gè)字典包含了用戶拍攝的圖片的大量有用信息。關(guān)于這些值的討論超出了本文的介紹范圍。 UIImagePickerControllerOrigina
43、lImage 這個(gè) key 的值類型為 UIImage,包含了用戶拍攝的圖片 UIImagePickerControllerCropRect 如果編輯是可用的話(使用 UIImagePickerController 的 allowsEditing 屬性),這個(gè)key 的值將包含一個(gè)裁減區(qū)域的矩形。 UIImagePickerControllerEditedImage 如果編輯是可用的話(使用 UIImagePickerController 的 allowsEditing 屬性),這個(gè)key 的值將包含一個(gè)裁減后的圖片(放大或縮小)。 如果用戶拍攝的是視頻,你可以訪問imagePickerCon
44、troller:didFinishPickingMediaWithInfo:方法中 didFinishPickingMediaWithInfo參數(shù)里面的 UIImagePickerControllerMediaURL 鍵。這個(gè)鍵的值是一個(gè) NSURL 類型,包含了用戶拍攝的視頻的 URL。 當(dāng)你獲得了用戶通過攝像頭拍攝的一個(gè) UIImage 引用后,就可以在程序中方便的使用它了。 注意:默認(rèn)情況下,在程序中,通過 image picker control 拍攝的相片不會(huì)被保存。1.2.4.13.1 小節(jié)參考1.3. 利用攝像頭進(jìn)行視頻的錄制1.3.1.問題12版本 1.0 | 2013 年 0
45、3 月 17 日DevDiv 熱心網(wǎng)友自發(fā)組織翻譯iOS 6 Programming Cookbook你想在你的應(yīng)用中添加視頻錄制的功能。DevDiv 熱心網(wǎng)友自發(fā)組織翻譯1.3.2.方案 使用 UIImagePickerController,并且附帶 UIImagePickerControllerSourceTypeCamera 源和kUTTypeMovie 媒體類型:- (void)viewDidLoadsuper viewDidLoad;if (self isCameraAvailable &self doesCameraSupportTakingPhotos)UIImagePicker
46、Controller *controller =UIImagePickerController alloc init;controller.sourceType = UIImagePickerControllerSourceTypeCamera;NSString *requiredMediaType = (_bridge NSString *)kUTTypeMovie;controller.mediaTypes = NSArray allocinitWithObjects:requiredMediaType, nil;controller.allowsEditing = YES;control
47、ler.delegate = self;self.navigationController presentModalViewController:controlleranimated:YES; else NSLog(Camera is not available.);注意:上面代碼中使用到的 isCameraAvailable 和 doesCameraSupportShootingVideos 方法在 13.1 中有實(shí)現(xiàn)。下面是 image picker control 的 delegate 方法實(shí)現(xiàn):- (void) imagePickerController:(UIImagePickerC
48、ontroller *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)infoNSLog(Picker returned successfully.);NSLog(%, info);NSString *mediaType = info objectForKey:UIImagePickerControllerMediaType;if (mediaType isEqualToString:(_bridge NSString *)kUTTypeMovie)NSURL *urlOfVideo =info objectForKey:UIImage
49、PickerControllerMediaURL;NSLog(Video URL = %, urlOfVideo);NSError *dataReadingError = nil;NSData *videoData =NSData dataWithContentsOfURL:urlOfVideooptions:NSDataReadingMappederror:&dataReadingError;if (videoData != nil)/* We were able to read the data */NSLog(Successfully loaded the data.); else /*
50、 We failed to read the data. Use the dataReadingErrorvariable to determine what the error is */NSLog(Failed to load the data with error = %,dataReadingError);picker dismissModalViewControllerAnimated:YES;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日13iOS 6 Programming Cookbook- (void)imagePickerControl
51、lerDidCancel:(UIImagePickerController *)pickerNSLog(Picker was cancelled);picker dismissModalViewControllerAnimated:YES;DevDiv 熱心網(wǎng)友自發(fā)組織翻譯1.3.3.討論如上代碼,首先我們還是需要先檢測(cè)設(shè)備是否能夠支持拍照的功能,然后我們?cè)谠O(shè)置成錄像的模式,最后我們可以在回調(diào)方法 didFinishPickingMediaWithInfo 中獲取到我們錄制的視頻。當(dāng)用戶在進(jìn)行視頻錄制的時(shí)候,這些視頻會(huì)保存在一些臨時(shí)的目錄當(dāng)中,并不是在多媒體的目錄當(dāng)中,一個(gè)通常的路徑形式如下。
52、file:/localhost/private/var/mobile/Applications /tmp/capture-作為一個(gè)開發(fā)人員,我們?yōu)橛脩籼峁┑牟⒉皇呛?jiǎn)單的錄像的功能,我們還需要提供視頻格式的問題。那么我們就需要使用如下兩個(gè)參數(shù)進(jìn)行設(shè)置。videoQuality這個(gè)屬性,我們有兩個(gè)設(shè)置的值,UIImagePickerControllerQualityTypeHigh(高清)UIImagePickerControllerQualityTypeMedium(普清)videoMaximumDuration這個(gè)屬性讓我們用來設(shè)置視頻錄制的最小單元,這個(gè)屬性是用秒來計(jì)算的。例如我們需要錄制高
53、清的視頻,每個(gè)文件的單元為 30 秒,那么我們就需要修改代碼,代碼如下。- (void)viewDidLoadsuper viewDidLoad;if (self isCameraAvailable &self doesCameraSupportTakingPhotos)UIImagePickerController *controller =UIImagePickerController alloc init;controller.sourceType = UIImagePickerControllerSourceTypeCamera;NSString *requiredMediaType
54、= (_bridge NSString *)kUTTypeMovie;controller.mediaTypes = NSArray allocinitWithObjects:requiredMediaType, nil;controller.allowsEditing = YES;controller.delegate = self;/* Record in high quality */controller.videoQuality = UIImagePickerControllerQualityTypeHigh;/* Only allow 30 seconds of recording
55、*/controller.videoMaximumDuration = 30.0f;self.navigationController presentModalViewController:controlleranimated:YES; else NSLog(Camera is not available.);1.3.4.13.1 小節(jié)參考DevDiv 熱心網(wǎng)友自發(fā)組織翻譯版本 1.0 | 2013 年 03 月 17 日14iOS 6 Programming CookbookDevDiv 熱心網(wǎng)友自發(fā)組織翻譯1.4. 把圖片存儲(chǔ)在多媒體庫中1.4.1.問題你需要來把圖片存儲(chǔ)在用戶的圖片庫中1
56、.4.2.方案使用 UIImageWriteToSavedPhotosAlbum 來處理:- (void) imageWasSavedSuccessfully:(UIImage *)paramImagedidFinishSavingWithError:(NSError *)paramErrorcontextInfo:(void *)paramContextInfoif (paramError = nil)NSLog(Image was saved successfully.); else NSLog(An error happened while saving the image.);NSLo
57、g(Error = %, paramError);- (void) imagePickerController:(UIImagePickerController *)pickerdidFinishPickingMediaWithInfo:(NSDictionary *)infoNSLog(Picker returned successfully.);NSLog(%, info);NSString *mediaType = info objectForKey:UIImagePickerControllerMediaType;if (mediaType isEqualToString:(_brid
58、ge NSString *)kUTTypeImage)UIImage *theImage = nil;if (picker allowsEditing)theImage = info objectForKey:UIImagePickerControllerEditedImage; else theImage = info objectForKey:UIImagePickerControllerOriginalImage;SEL selectorToCall =selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextI
59、nfo:);UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall,NULL);picker dismissModalViewControllerAnimated:YES;- (void)imagePickerControllerDidCancel:(UIImagePickerController *)pickerNSLog(Picker was cancelled);picker dismissModalViewControllerAnimated:YES;- (void)viewDidLoadsuper viewDidLoad
60、;if (self isCameraAvailable &self doesCameraSupportTakingPhotos)UIImagePickerController *controller =UIImagePickerController alloc init;controller.sourceType = UIImagePickerControllerSourceTypeCamera;NSString *requiredMediaType = (_bridge NSString *)kUTTypeImage;controller.mediaTypes = NSArray alloc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建房專用合同范本
- 門市住房合同范本
- 借款合同范本x
- 機(jī)械購買合同范本
- 科技引領(lǐng)現(xiàn)代制造業(yè)的綠色發(fā)展之路
- 為學(xué)生提供職業(yè)發(fā)展指導(dǎo)計(jì)劃
- 小區(qū)喂飯服務(wù)合同范本
- 室內(nèi)修繕合同范本
- 接收設(shè)備中微電子封裝技術(shù)的發(fā)展考核試卷
- 地質(zhì)勘探儀器在地震勘探中的角色考核試卷
- 微信個(gè)人簡(jiǎn)歷
- 軟件測(cè)試jmeter中英文對(duì)照
- 《伊利乳業(yè)集團(tuán)企業(yè)內(nèi)部審計(jì)存在的問題及優(yōu)化對(duì)策分析案例(論文)10000字》
- 反假貨幣培訓(xùn)考試題庫-相關(guān)法律法規(guī)及規(guī)范性文件知識(shí)考題
- 鉆井安全操作規(guī)程中英文
- 體育《網(wǎng)球正手擊球》教學(xué)PPT
- 離心機(jī)操作規(guī)程
- 富氫水水素水推廣方法
- 煤礦職業(yè)衛(wèi)生培訓(xùn)課件2023
- 某小學(xué)申報(bào)廣州市義務(wù)教育規(guī)范化學(xué)校自評(píng)分說明
- 面神經(jīng)炎課件完整版
評(píng)論
0/150
提交評(píng)論