搜尋此網誌

2012年7月26日 星期四

(IOS)使用 MPMoviePlayerController 播放影片



 

在很多應用程式的開頭常常會看到使用影片來播放動畫或是該製作群的 Logo 等,其實這些影片就是透過 MPMoviePlayerController 來進行播放,至於要如何實做,請看下列程式碼示範。(View-based Template)

首先別忘了把函式庫的標頭檔和 Framework 加到專案中,Framework 加入的方法可以參考 Xcode 4 新增 Framework 的方法ㄧ文。



1
#import <MediaPlayer/MediaPlayer.h>


完成上述步驟之後,別忘記將所要播放的影片檔放至專案內的資料夾內,就可以開始撰寫影片播放的程式碼了。(此範例是直接在程式進入點撰寫播放影片的程式碼)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//設定影片檔路徑
NSString *path = [[NSBundle mainBundle] pathForResource:@"Furnace" ofType:@"m4v"];
NSURL *url = [NSURL fileURLWithPath:path];
//player為MPMoviePlayerController型態的指標
player = [[MPMoviePlayerController alloc] initWithContentURL:url];
//旋轉90度
player.view.transform = CGAffineTransformMakeRotation(1.5707964);
//使用Observer製作完成播放時要執行的動作
[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(moviePlayBackDidFinish:)
                                      name:MPMoviePlayerPlaybackDidFinishNotification
                                      object:player];
//設定影片比例的縮放、重複、控制列等參數
player.scalingMode = MPMovieScalingModeAspectFit;
player.repeatMode = MPMovieRepeatModeNone;
player.controlStyle = MPMovieControlStyleDefault;
//將影片加至主畫面上
player.view.frame = self.view.bounds;
[self.view addSubview:player.view];
[player play];

示範中所使用的影片是 320 x 480 必須橫向觀賞,因此在播放之前就先將畫面旋轉 90 度再進行播放的動作,如果你的影片無法與螢幕比例批配,或是需要配合旋轉畫面自動縮放,可以參考下列作法。

1
2
//自動縮放符合畫面比例
player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

1
2
3
4
5
//將專案內此函式的註解拿掉並回傳YES
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //啟用畫面自動旋轉
    return YES;
}

程式碼到這裡已經可以成功播放影片,可是當影片播放之後畫面還停留在影片的最後一個影格,此時要將影片從畫面上移除就可以借用上述程式碼中所設定的 NSNotificationCenter 來達成此目的,在上述程式碼我們已經設定好影片播放完成時所要執行的函式,現在就來看看要如實作此函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
//自行定義影片播放完成的函式
- (void)moviePlayBackDidFinish:(NSNotification *)notification {
    //因為只播放一次所以在這就直接移除此Observer
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                          name:MPMoviePlayerPlaybackDidFinishNotification
                                          object:player];
    [player stop];
    //將影片重畫面上移除
    [player.view removeFromSuperview];
    [player release];
}

最後,這裡還存在一個記憶體釋放的問題,如果影片沒有播放到最後就把程式關掉,或是有其他原因導致影片無法播放完成,這樣很有可能會衍生其他的記憶體問題,因此別忘記在 dealloc 中再次實作記憶體釋放的動作。

1
2
3
4
5
6
7
8
9
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                          name:MPMoviePlayerPlaybackDidFinishNotification
                                          object:player];
    [player release];
    [super dealloc];
}

請問這個controller可以記錄上次播放的進度嗎?
下次進去的時候自動從上次離開的地方開始撥?
感謝
回覆



  1. henry 您好:

    關於這部份的功能,你必須手動自己實作唷,如果你的應用程式在尚未完全結束(停留在背景執行),MPMoviePlayerController 會自動幫您做這件事情,但是如果你是完全關掉關掉應用程式,那麼你必須記錄最後播放時間,下次啟動應用程式時在設定播放時間,下面有幾個METHOD供您參考,以時間的話我會在把它寫成文章的,感謝您的指教。

    //在MPMoviePlayerController變更播放狀態時的Notification名稱(監視播放狀態的變更可用來記入最後播放時間)
    MPMoviePlayerPlaybackStateDidChangeNotification

    //記錄播放時間的方法
    NSTimeInterval playbackTime = [player currentPlaybackTime];

    //設定播放時間的方法
    [player setInitialPlaybackTime:playbackTime];

    ps:記錄與設定播放時間不要寫在同一個function中會失效喔,例如設定播放時間為5.0,接著馬上記錄播放時間,這樣得到的紀錄播放時間會是0.0
    記錄播放時間的方法可以寫在MPMoviePlayerController播放狀態變更處,另外我原本以為他會有 Delegate 讓我們去改寫MPMoviePlayerController處於各種狀態的方法,不過網路上好像都是用Notification的方式比較多,這點我還要在研究看看。

    設定事前是放在 [player play] 之前,在播放之前就要設定時間,我覺得你沒跳到正確時間應該是 playbackTime 的數值是空的,你可以先設定浮點數看看,
    例如 [player setInitialPlaybackTime:3.0]跳到3秒處。

沒有留言:

張貼留言