【问题标题】:Why does MPMoviePlayerController setCurrentPlaybackTime goes to the wrong time?为什么 MPMoviePlayerController setCurrentPlaybackTime 去错了时间?
【发布时间】:2011-11-13 21:59:18
【问题描述】:

我对 MPMoviePlayerController 感到有些奇怪。

我正在尝试设置正在播放的视频的 currentPlaybackTime(文件源)。 这是一个发生的例子

  1. 播放视频
  2. 点击按钮跳转到视频 9.3 秒
  3. 播放状态变化如下:

a) 播放状态 = 5 (MPMoviePlaybackStateSeekingBackward)。 currentPlaybackTime = 15.74(这是我按下按钮的时间)

b) 播放状态 = 1 (MPMoviePlaybackStatePlaying)。当前播放时间 = 7.32

我尝试将 currentPlaybackTime 设置为 7.32 似乎并不重要。

一些额外的信息: 即使使用 MPMoviePlayerController 上的内置控件,我也会得到这种行为。例如如果我将它向前滚动到 15 秒,它会跳回到 7.32

有什么想法吗?和媒体文件有关系吗?

【问题讨论】:

  • 精确搜索取决于内容编码。您可以重新编码视频并强制使用更多 i-Frame。这会降低压缩率,但会增加精确搜索的机会。
  • 它似乎并不特定于内容。为什么 quicktime 可以跳转到准确的位置?
  • 见下文。事实证明,如果您使用 AVPlayer,您可以使用 seekTo:toleranceBefore:toleranceAfter 方法更具体地了解准确性
  • MPMoviePlayerController 是一个错误的噩梦。在Chris Danielson的回答下查看我的评论。

标签: iphone objective-c mpmovieplayercontroller


【解决方案1】:

您应该使用 seekToTime 或 seekToTimeWithSeconds 进行搜索。

 CMTime npt = CMTimeMake(9,1);
 [self.player seekToTime:npt];

  CMTime npt = CMTimeMakeWithSeconds(9.3, 600);
   [self.player seekToTime:npt toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

【讨论】:

  • 这应该没什么区别 - currentPlaybackTime 很好。
  • 我可以确认我是否改用 AVPlayer 我在使用 seekToTime 时遇到与使用 currentPlaybackTime 时相同的问题
  • 在进一步调查中,还有另一种 seekToTime 方法似乎可以完成这项工作。 seekToTime:toleranceBefore:toleranceAfter:。如果您将 kCMTimeZero 作为公差传递给它,那么它似乎是准确的。
  • @cdasher - 感谢您的帮助。您的回答为我指明了正确的方向,我被难住了。在您的答案中需要添加/更改一些内容(如果您可以更新它,我会接受)。具体来说,CMTimeMake 采用整数输入。我最终使用 CMTimeMakeWithSeconds(float, integer) 代替 timescale 参数设置为 600。然后我使用 seekToTime:npt toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero 强制它进行样本准确搜索。
  • 此方法适用于 AVPlayer 但不适用于 MPMoviePlayerController。
【解决方案2】:

cdasher 为我指出了正确的方向,但这是你应该做的:

使用 seekToTime:toleranceBefore:toleranceAfter 寻找样本准确寻找。为此,您必须使用 AVPlayer 而不是 MPMediaPlayerController

CMTime npt = CMTimeMakeWithSeconds(9.3, 600);
[self.player seekToTime:npt toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];

【讨论】:

    【解决方案3】:

    这是一个较晚的回复,但我找到了一个类似的解决方案。 您可以按如下方式修改播放:

    #define START_TIME 50.0f
    #define END_TIME   START_TIME + 20.0f  //play for 20 seconds
    
    MPMoviePlayerController *player = [self moviePlayerController];
    [player stop];
    [player setInitialPlaybackTime:START_TIME];
    [player setEndPlaybackTime:END_TIME];
    [player play];
    

    【讨论】:

    • 不行,和设置currentPlaybackTime属性一样
    • 是的,它不再起作用了……你是对的。这在 2011 年 10 月 5 日最初发布时确实有效。
    • MPMoviePlayerController 是最糟糕的 Apple API。它是如此可怕的越野车。设置初始播放时间和结束播放时间仅在初始化后的第一次有效。一旦它开始播放,如果我想停止它并从同一点重新启动它,我必须分配/初始化一个新实例才能让它工作。我在它的虫群中浪费了无数个小时。
    【解决方案4】:

    我想分享一下我使用 MPMoviePlayerController mediaPlayer 播放 MP3 的经验。

    [mediaPlayer setCurrentPlaybackTime:currentPlayBackTime]; // 它不适用于 MP3 文件。这仅适用于视频。

    我用于 MP3,它适用于 IOS 11 及更高版本。

    [mediaPlayer setInitialPlaybackTime:currentPlayBackTime]; // 从最后一个位置播放 MP3 文件

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 2015-02-21
      • 2013-11-01
      • 2021-01-29
      • 2016-03-24
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多