当从设备本地播放.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 回答
未通知远程mp4的原因是您在创建播放器后立即观察来自
AVPlayer
实例的currentItem
的通知,并且currentItem
将为nil
,直到从服务器加载内容为止 .处理此问题的推荐方法是观察播放器实例的
status
属性,一旦该状态等于AVPlayerStatusReadyToPlay
,您就可以开始观察来自currentItem
的通知 . 在this SO answer中有一个很好的解释以及示例代码