首页 文章

使用AVFoundation AVPlayer从服务器循环播放不能正常工作

提问于
浏览
0

当从设备本地播放.mp4时,媒体按预期循环播放 . 当媒体来自服务器时,视频停止播放时不会触发通知

AVPlayer *avPlayer = [AVPlayer playerWithURL:[NSURL URLWithString:@"http://www.someurl.com/someMedia.mp4"]];
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
avPlayerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view.layer addSublayer:avPlayerLayer];

[avPlayer play];


// Loop video
avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:[avPlayer currentItem]];




- (void)playerItemDidReachEnd:(NSNotification *)notification {

    NSLog(@"Video ended");

    AVPlayerItem *p = [notification object];
    [p seekToTime:kCMTimeZero];
}

检查了Looping a video with AVFoundation AVPlayer?How do I loop a video with AVFoundation without unwanted pauses at the end?

UPDATE

感谢ChrisH为此,创建了一个延迟,允许在观察播放器之前从服务器加载视频正确地停止视频

double delayInSeconds = 7.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[avPlayer currentItem]];



    });

1 回答

  • 0

    未通知远程mp4的原因是您在创建播放器后立即观察来自 AVPlayer 实例的 currentItem 的通知,并且 currentItem 将为 nil ,直到从服务器加载内容为止 .

    处理此问题的推荐方法是观察播放器实例的 status 属性,一旦该状态等于 AVPlayerStatusReadyToPlay ,您就可以开始观察来自 currentItem 的通知 . 在this SO answer中有一个很好的解释以及示例代码

相关问题