【问题标题】:Set ContentURL of MPMoviePlayerController twice两次设置 MPMoviePlayerController 的 ContentURL
【发布时间】:2011-03-21 21:14:03
【问题描述】:

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

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

// add to view, setup moviePlayerController's view frame, etc

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

NSURL *fileUrl = ...
self.moviePlayerController.contentURL = fileUrl;

一切都很好。

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

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

这不起作用,即使 fileUrl2 == fileUrl1。

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

在第一次 setContentURL 之后:

loadState == 可玩 |通关OK

playbackState == 正在播放

在我的第二个 setContentURL 之后:

playbackState == 停止

loadState == 未知

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

谢谢!

【问题讨论】:

    标签: cocoa cocoa-touch mpmovieplayercontroller media-player mpmovieplayer


    【解决方案1】:

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

    self.moviePlayerController.contentURL = fileUrl;
    [self.moviePlayerController play];
    

    但是,这不是我想要的行为。我发现当

    -[MPMoviePlayerController play]
    

    被调用,

    -[MPMoviePlayerController prepareToPlay]
    

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

    所以,我只是将 setContentURL 调用更改为以下内容,一切正常。

    self.moviePlayerController.contentURL = fileUrl;
    [self.moviePlayerController prepareToPlay];
    

    【讨论】:

    • 调试时间减少到一行代码 :) 非常感谢您的发帖,我从来没有尝试过。
    【解决方案2】:

    contentURL 属性的文档说明如下:

    如果您在播放电影时设置此属性,则该电影会暂停并开始加载新电影。新电影从头开始播放。

    因此,您遇到的不是预期的行为。您可能需要使用errorLog 属性检索并检查MPMoviePlayerController 的错误日志。

    【讨论】:

    • 我无法使用 errorLog,因为我正在从文件本地加载我的电影,而 errorLog 说它仅用于网络流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多