开发者

Notification when AVQueuePlayer rewinds to the beginning of an item

I have 5 AVPlayerItems in my AVQueuePlayer, which is set to AVPlayerActionAtItemEndAdvance. I hit play on my UI, and play the first, the second and then start playing the third. Then I hit my rewind button. What I want to happen is that the third video rewinds to its start, and I then get a notification 开发者_如何学Cthat allows me to stop. What I'm seeing is that I get a status of ready to play for the 4th item, followed by a current item changed to the 4th item - then the 4th item plays.

Why does the 4th item become the current item after the 3rd item has rewound to its start

Is the only way I can stop this to set the player to not auto advance (AVPlayerActionAtItemEndPause), observe the end of each item, and hope I get an "end of play" notification for the rewinding of the 3rd item as well as when it plays to its end naturally. Then in my end observer code, I can check the rate of the player, and if rewinding, not advance to the next item.


The way I handled this was in the begin seeking code, set the actionAtItemEnd to AVPlayerActionAtItemEndNone, and then reset it back to AVPlayerActionAtItemEndAdvance when the seeking ends. On iOS6, it appears that one can seek past the start of the track. In the "end seeking" code, I reset the rate and current time before beginning normal playback.

The following method is called by a long press gesture recognizer.

- (IBAction)fastRewind:(id)sender
{
    UIGestureRecognizer *recog = (UIGestureRecognizer*)sender;
    if (recog.state == UIGestureRecognizerStateBegan) {
        if (_player.rate == 1) {
            NSLog(@"fastRewind begin\n%@", sender);
            _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
            _player.rate = -2;
        }
    } else if (recog.state != UIGestureRecognizerStateChanged) {
        // Ended/Canceled
        NSLog(@"fastRewind end\n%@", sender);
        if (_player.rate < 0) {
            _player.rate = 0;
            if (CMTimeGetSeconds(_player.currentTime) < 0) {
                [_player seekToTime:CMTimeMake(0, 1)];
            }
            _player.actionAtItemEnd = AVPlayerActionAtItemEndAdvance;
            _player.rate = 1;
        }
    }
}

One may wish to speed up the seek if it is held for a longer period of time.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜