在很多應用程式的開頭常常會看到使用影片來播放動畫或是該製作群的 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 alloc] initWithContentURL:url];
player.view.transform = CGAffineTransformMakeRotation(1.5707964);
[[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
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
|
程式碼到這裡已經可以成功播放影片,可是當影片播放之後畫面還停留在影片的最後一個影格,此時要將影片從畫面上移除就可以借用上述程式碼中所設定的 NSNotificationCenter 來達成此目的,在上述程式碼我們已經設定好影片播放完成時所要執行的函式,現在就來看看要如實作此函式。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
- (void)moviePlayBackDidFinish:(NSNotification *)notification {
[[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];
}
|
下次進去的時候自動從上次離開的地方開始撥?
感謝