【问题标题】:Loop a segment of a video with AVPlayer使用 AVPlayer 循环播放一段视频
【发布时间】:2013-07-19 18:00:51
【问题描述】:

我正在尝试循环一段视频,给定两个帧标记(markIn 和 markOut)。选择循环选项时,播放器将循环视频的此段。我目前使用 Apple 的建议设置了整个视频的循环,即在到达结束后发送 AVPlayerItemDidPlayToEndTimeNotification

我认为实现这一点的一种干净的方法是在到达 markOut 点时发送通知,如果激活循环,​​它将把播放器移回 markIn 点。那么有没有办法按照 playerItemDidReachMarkOut 的方式创建通知?

我对通知和 AVPlayer 还很陌生,所以如果我遗漏了什么,请原谅我。

【问题讨论】:

    标签: objective-c cocoa avfoundation avplayer nsnotificationcenter


    【解决方案1】:

    您正在寻找的东西称为边界时间观察者。你给你的 AVPlayer 一个CMTimes 的列表,它会在玩家的currentTime 大约是这些时间时通知你。

    它是这样工作的:

    //Use an unretained reference in the block to break the retain cycle of the player retaining the block retaining the player retaining…
    __unsafe_unretained AVPlayer *weakPlayer = _myPlayer;
    
    _myObserver = [_myPlayer addBoundaryTimeObserverForTimes:@[ [NSValue valueWithCMTime:markOutTime] ]
        queue:dispatch_get_main_queue()
        usingBlock:^{
            [weakPlayer seekToTime:markInTime
                /*optional:
                toleranceBefore:kCMTimeZero
                toleranceAfter:kCMTimeZero
                */
                ];
        }
    ];
    

    当然,稍后您必须使用removeTimeObserver: 告诉AVPlayer 停止此观察。你给它你从addBoundaryTimeObserver…:::得到的对象。

    注意事项/注意事项/警告

    • 尽管有名称,但它们不必是“边界”时间。您可以只有一个时间,即使您没有,AVPlayer 也不会推断任何时间是开始时间、结束时间、中点还是其他任何时间。
    • 同一块可能会针对同一“边界”多次调用。确保您妥善处理此问题(在我的情况下,我必须确保不要两次显示相同的字幕)。
    • 搜索时不调用边界时间观察器(同样,时间并没有真正解释为开始和结束意义上的“边界”)。如果您直接寻找边界时间(或多或少 - 见下一点),您应该收到通知,但寻找两个边界之间或多个边界之间的点不会导致观察。
    • 我说的差不多,我是认真的。我看到 AVPlayer 多次通知的主要情况是 AVPlayer 提前通知一点,然后在(或至少更接近)确切时间再次通知。不要假设currentTime 与您提供的任何时间完全相同。

    【讨论】:

    • 谢谢彼得,这似乎是我要找的。自从发布问题以来,我通过将结束时间更改为 markOut 点来实现它。所以现在我可以使用 playerItemDidReachEnd 并且玩家会认为 markOut 点是结束点,此时它将“循环”回到给定的 markIn 点。显然这有一些限制,例如将播放头移过新的“结束”会触发通知。为了避免这种情况,只要播放头移出循环边界(在 markIn 之前或 markOut 之后),我就会取消循环。
    • 由于这些限制,我会尝试您的解决方案,但我可以看到解决方案的大致性质在需要精度/一致性时是一个问题。
    【解决方案2】:
    [m_player seekToTime:CMTimeMakeWithSeconds(5.0f, time.timescale) toleranceBefore: kCMTimeZero toleranceAfter: kCMTimeZero];
    

    【讨论】:

    • 这只是问题的一半;提问者缺少的部分是“到达 markOut 点时的通知”。
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多