2014年7月13日 星期日

Video Capture programmatically using Swift language

【說明】

此份筆記是根據ISBN:978-986-201-900-9這本書的第24章節所紀錄的。

此份專案可以讓使用者錄製一段影片,並在MPMoviePlayerController上顯示,並在影片播畢後顯示UIAlertView提醒使用者。


【專案開發步驟】

建立專案:

使用Single View Application模板建立一個名為VideoApp的專案,使用iPhone裝置。

設計使用者介面:

在畫面上加入一個按鈕,如下圖所示。

設計User Interface
建立物件與類別的IBAction,如下圖所示。

物件與類別的IBAction
實作VideoViewController:

首先在ViewController內import兩個標頭檔,如下所示。

import MediaPlayer
import MobileCoreServices

讓ViewController繼承UIImagePickerControllerDelegate與UINavigationControllerDelegate,如下所示。

class ViewController: UIViewControllerUIImagePickerControllerDelegateUINavigationControllerDelegate { }

建立兩個變數,分別如下。

var videoURL: NSURL!
var videoController: MPMoviePlayerController!

實作按鈕按下後的func:

將以下程式碼加入至func內。

if (UIImagePickerController.isSourceTypeAvailable(.Camera)) {
            
    var picker: UIImagePickerController = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .Camera
    picker.mediaTypes = UIImagePickerController.availableMediaTypesForSourceType(.Camera)
    picker.videoQuality = .TypeHigh
            
    self.presentViewController(picker, animated: true, completion: nil)
}
概念大致上與這篇相似,不同的地方在於多了mediaType與videoQuality。mediaType是設定picker的媒體型式,這裡設定為所有形式。videoQuality是設定影片的品質,這裡設定較高的畫質。

實作影片的播放:

當使用者確認使用所拍攝的影片後會呼叫didFinishPickingMediaWithInfo:方法,如下所示。

func imagePickerController(_picker: UIImagePickerController!, didFinishPickingMediaWithInfo info: NSDictionary!) { }

將以下程式碼放置didFinishPickingMediaWithInfo:方法內。

videoURL = info[UIImagePickerControllerMediaURL] as NSURL
_picker.dismissViewControllerAnimated(true, completion: nil)
        
videoController = MPMoviePlayerController()
        
videoController.contentURL = videoURL
videoController.view.frame = CGRectMake(0, 0, 320, 460)
view.addSubview(videoController.view)
        
NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoPlayBackDidFinish", name: MPMoviePlayerPlaybackDidFinishNotification, object: videoController)
        
videoController.play()
先取得影片的系統URL。將相機視窗消失。將videoController這個變數設定為MPMoviePlayerController物件。將videoController的內容URL設定為剛剛取得的URL。設定videoController的畫面大小。請求view將videoController顯示出來。MPMoviePlayerController物件有個通知功能,可以用來控制影片的播放,所以我們在這建立一個通知,當影片播完時MPMoviePlayerPlaybackDidFinishNotification就會送出,並觸發videoPlayBackDidFinish:這個方法。最後叫VideoController播放影片。

使用影片播放器通知:

當影片播放結束後,NotificationCenter會發送播放完畢的通知,並觸發videoPlayBackDidFinish:這個方法,所以我們必須建立一個videoPlayBackDidFinish:方法,處理通知產生後的動作,如下所示。

func videoPlayBackDidFinish() { }
建立一個func,讓通知產生時可以執行func內的事情。

將以下程式碼放置videoPlayBackDidFinish:方法內,如下所示。

NSNotificationCenter.defaultCenter().removeObserver(self, name: MPMoviePlayerPlaybackDidFinishNotification, object: nil)
        
videoController.stop()
videoController.view.removeFromSuperview()
videoController = nil
        
var alertView = UIAlertController(title: "Video Playback", message: "Just finished the video playback, The video is now removed", preferredStyle: .Alert)
alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
self.presentViewController(alertView, animated: true, completion: nil)
首先將NotificationCenter監聽通知的匹配移除。叫videoCotroller停止播放影片。將videoController的view從畫面上移除。將videoController設為空的。最後顯示UIAlertView來告訴使用者影片已經播畢。


【執行結果】

    
    


【專案範例】

沒有留言:

張貼留言