设置MPMoviePlayerController的ContentURL两次

Hea*_*ers 3 cocoa cocoa-touch mpmovieplayercontroller media-player mpmovieplayer

我在loadView方法中创建了一个嵌入式MPMoviePlayerController:

self.moviePlayerController = [[[MPMoviePlayerController alloc] init] autorelease];

// add to view, setup moviePlayerController's view frame, etc
Run Code Online (Sandbox Code Playgroud)

我可以稍后加载用户选择的电影:

NSURL *fileUrl = ...
self.moviePlayerController.contentURL = fileUrl;
Run Code Online (Sandbox Code Playgroud)

一切都很好.

但是,如果我再次设置contentURL:

NSURL*fileUrl2 = ... self.movi​​ePlayerController.contentURL = fileUrl2;

即使fileUrl2 == fileUrl1,这也不起作用.

当我更改contentURL时,我得到以下playbackState和loadState:

在第一个setContentURL之后:

loadState == playable | playthroughOK

playbackState ==播放

在我的第二个setContentURL之后:

playbackState ==已停止

loadState == unknown

我当然可以为每部电影创建一个新的MPMoviePlayerController,但我想确保这个问题不是一个更大的问题.

谢谢!

Hea*_*ers 9

在我的初始版本中,我只允许通过嵌入式控件播放电影.如果我在设置contentURL后强制电影立即开始播放,一切正常:

self.moviePlayerController.contentURL = fileUrl;
[self.moviePlayerController play];
Run Code Online (Sandbox Code Playgroud)

但是,这不是我想要的行为.我发现的时候

-[MPMoviePlayerController play]
Run Code Online (Sandbox Code Playgroud)

叫做,

-[MPMoviePlayerController prepareToPlay]
Run Code Online (Sandbox Code Playgroud)

被自动调用.显然,必须调用prepareToPlay才能显示电影的嵌入控件和初始帧.它似乎是第一次调用setContentURL时自动调用.

所以,我刚刚将setContentURL调用更改为以下内容,一切正常.

self.moviePlayerController.contentURL = fileUrl;
[self.moviePlayerController prepareToPlay];
Run Code Online (Sandbox Code Playgroud)