【问题标题】:MPMoviePlayer setCurrentPlaybackTime iOSMPMoviePlayer setCurrentPlaybackTime iOS
【发布时间】:2012-05-17 12:41:09
【问题描述】:

我使用 MPMoviePlayer 播放我的视频,我遇到的问题是当用户按下设备的 home 按钮时,我保存视频的当前位置,而不是他再次午餐应用程序时我希望他从他离开的地方开始,所以我使用 setCurrentPlaybackTime 函数,它在 iOS 5 中完美运行 但不是在 iOS 5.1 中视频从头开始。

有没有机构可以解决这类问题?

【问题讨论】:

  • 你是如何存储时间的?也许这就是问题.... 和 setCurrentPlaybackTime。检查您在 5.1 中存储的值。
  • 我将它存储在一个具有单例模式的类的属性中,但时间是正确的,我用户 NSLog() 来检查它并且似乎有正确的价值

标签: ios objective-c audio mpmovieplayercontroller playback


【解决方案1】:

我的问题已经解决了,我会解释我到目前为止所做的事情。

当我找不到该行为的解决方案/解释时(我觉得这很奇怪),我开始大量记录日志,所以我注意到当我记录当前位置时,我总是得到(在 iOS 5.1 )

  currentPlaybackTime = nan

但在 iOS 5 中,我得到的正常值为 0.00000

所以我做了一个计时器(它会重复自己)来记录每次当前的时间,所以我注意到它从 nan 变为 0.00000强>一段时间后

我得出的结论是,在设置 PlaybackTime 之前我需要稍等(不明白为什么),所以在等待 1 ms (1/1000 s),它的工作原理。

【讨论】:

    【解决方案2】:

    您是否尝试过使用 seekToTime(仅限 AvPlayer)而不是 setCurrentPlaybackTime?

    这里建议:
    Why does MPMoviePlayerController setCurrentPlaybackTime goes to the wrong time?

    注意:此解决方案适用于 AvPlayer 而不是 MPMoviePlayer(即使很难,也未在列出的链接中指明)。但在切换到 AvPlayer 之前,我会等待其他答案。

    【讨论】:

    • 我现在试过了,但它似乎不知道函数 seekToTime 并且它在构建时给我一个错误,或者我做错了什么?
    • 这是我收到的复杂错误消息:“MPMoviePlayerController”没有可见的@interface 声明选择器“seekToTime:”
    • 我很抱歉最初没有说明答案依赖于从 MPMoviePlayer 切换到 AvPlayer(我检查了帖子,是的,最初阅读它时并不明显)。
    • 嗯.. 好的,所以我不能在这种情况下使用它,我已经用 MPMoviePlayer 做了很多事情,我还没有准备好重复所有内容,我也不确定如果我能及时完成,无论如何谢谢您的帮助:)。最让我不安的是,iOS 5 的一切都运行良好 :(
    【解决方案3】:

    我们应该在收到 MPMoviePlayerLoadStateDidChangeNotification 通知后设置 currentPlaybackTime。

    要知道moviePLayer是否加载,首先需要注册MPMoviePlayerLoadStateDidChangeNotification

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieLoadStateDidChange:) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];
    

    一旦电影播放器​​被加载,movieLoadStateDidChange: 将被调用,然后检查 MPMovieLoadStatePlaythroughOK 加载状态并设置 currentPlaybackTime。

    - (void)movieLoadStateDidChange:(NSNotification *)notification
    {
        MPMoviePlayerController *player = notification.object;
        MPMovieLoadState loadState = player.loadState;
    
        /* Enough data has been buffered for playback to continue uninterrupted. */
        if (loadState & MPMovieLoadStatePlaythroughOK)
        {
            //should be called only once , so using self.videoLoaded - only for  first time  movie loaded , if required. This function wil be called multiple times after stalled
            if(!self.videoLoaded)
            {
                self.moviePlayerController.currentPlaybackTime = self.currentPlaybackTime;
                self.videoLoaded = YES;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多