en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

12.22.2011

使用 UIImagePickerController 錄製影片的方法

  

雖然說是使用 UIImagePickerController 截取影片的方法,不如說是如何開啓 UIImagePickerController 的攝影功能,在之前的文章使用 UIImagePickerController 截取 Camera 畫面的方法一文中,我們已經能透過控制 UIImagePickerController 來產生一個 iOS 內建的攝影機框架(View),並且透過它來進行拍照,在接下來文章中,我們將改寫之前的程式碼,設定並開啓 UIImagePickerController 的 MediaTypes 功能,讓它同時也俱有攝影的功能。(已使用 ARC 機制)

首先是在建立 UIImagePickerController 的部份,增加以下兩行程式碼來開啓攝影的功能,你會發現到介面上多了可以切換照相 / 攝影的功能。

//設定MediaTypes的類型
NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:imagePicker.sourceType];
imagePicker.mediaTypes = mediaTypes;

當新增上述程式碼之後先別急著執行程式,因為在增加了攝影功能之後,使用者按下「使用」這張影像時,系統並不會知道所要使用的是「圖片」還是「影片」,因此我們還需要改寫該內建還式 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info,讓它可以分別對兩種不同的格式的檔案做處理才行。

//使用代理之後才會出現的內建函式
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    //取得使用的檔案格式
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    //使用的檔案格式是圖片
    if ([mediaType isEqualToString:@"public.image"]) {

        //使用先前的程式碼
    }

    //使用的檔案格式是影片
    if ([mediaType isEqualToString:@"public.movie"]) {

         //取得影片的位置
         NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

         //儲存影片於相簿中
         UISaveVideoAtPathToSavedPhotosAlbum(videoURL.path, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
    }

    //移除Picker
    [picker dismissModalViewControllerAnimated:YES];
}

最後是我們自行建立的函式,目的是用來判斷影片是否有存入成功,如果您不想增加此判斷式,只要修改儲存影像於相簿中的程式碼片段,改寫成
UISaveVideoAtPathToSavedPhotosAlbum(videoURL.path, self, nil, nil) 即可。

//自行建立判斷儲存成功與否的函式
- (void)video:(NSData *)video didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    UIAlertView *alert;

    //以error參數判斷是否成功儲存影像
    if (error) {
        alert = [[UIAlertView alloc] initWithTitle:@"錯誤"
                                           message:[error description]
                                          delegate:self
                                 cancelButtonTitle:@"確定"
                                 otherButtonTitles:nil];
    } else {
        alert = [[UIAlertView alloc] initWithTitle:@"成功"
                                           message:@"影像已存入相簿中"
                                          delegate:self
                                 cancelButtonTitle:@"確定"
                                 otherButtonTitles:nil];
    }

    //顯示警告訊息
    [alert show];
}






沒有留言:

張貼留言