forwardPlaybackEndTime does not work

痞子三分冷 提交于 2019-12-13 04:51:04

问题


AVPlayerItem has this property forwardPlaybackEndTime

The value indicated the time at which playback should end when the playback rate is positive (see AVPlayer’s rate property).

The default value is kCMTimeInvalid, which indicates that no end time for forward playback is specified. In this case, the effective end time for forward playback is the item’s duration.

But I don't know why it does not work. I tried to set it in AVPlayerItemStatusReadyToPlay, duration available callback, ... but it does not have any effect, it just plays to the end

I think that forwardPlaybackEndTime is used to restrict the playhead, right? In my app, I want to play from the beginning to the half of the movie only

My code looks like this

- (void)playURL:(NSURL *)URL
{
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:URL];

    if (self.avPlayer) {
        if (self.avPlayer.currentItem && self.avPlayer.currentItem != playerItem) {
            [self.avPlayer replaceCurrentItemWithPlayerItem:playerItem];
        }
    } else {
        [self setupAVPlayerWithPlayerItem:playerItem];
    }

    playerItem.forwardPlaybackEndTime = CMTimeMake(5, 1);

    // Play
    [self.avPlayer play];
}

How to make forwardPlaybackEndTime work?


回答1:


Try this

   AVPlayerItem.forwardPlaybackEndTime = CMTimeMake(5, 1);
   Here 5 is the time till the AVPlayerItem will play.



回答2:


Set the following on your AVPlayer

AVPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;

Then set your notification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidPlayToEndTime:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

with the method obviously

- (void) playerItemDidPlayToEndTime:(NSNotification*)notification
{
// do something here
}

then set your forwardPlaybackEndTime

AVPlayer.currentItem.forwardPlaybackEndTime = CMTimeAdd(AVPlayer.currentItem.currentTime, CMTimeMake(5.0, 1));

and start your avplayer playing

AVPlayer.rate = 1.0;

the notification will be triggered and your track will continue playing. In your handler you can stop it and do a seekToTime or whatever.

Alternatively you can just set a boundary observer

NSArray *array = [NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(5.0, 1)]];


    __weak OTHD_AVPlayer* weakself = self;
    self.observer_End = [self addBoundaryTimeObserverForTimes:array queue:NULL usingBlock:^{ if( weakself.rate >= 0.0 )     [weakself endBoundaryHit]; }];



回答3:


I have checked below code its running and streaming stops at specified time:

- (void)playURL
{

NSURL *url = [NSURL URLWithString:@"http://clips.vorwaerts-gmbh.de/VfE_html5.mp4"];

self.playerItem = [AVPlayerItem playerItemWithURL:url];

self.playerItem.forwardPlaybackEndTime = CMTimeMake(10, 1);

self.avPlayer = [AVPlayer playerWithPlayerItem:self.playerItem];

[videoView setPlayer:self.avPlayer];

// Play
[self.avPlayer play];
}

I hope this will help you.

Also please check these tutorials: AVFoundation Framework




回答4:


I think that you have to update avPlayer's current playerItem.

So,

 playerItem.forwardPlaybackEndTime = CMTimeMake(5, 1);

it should be:

 self.avPlayer.currentItem.forwardPlaybackEndTime = CMTimeMake(5, 1);


来源:https://stackoverflow.com/questions/25717819/forwardplaybackendtime-does-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!