我正在尝试使用AVPlayer播放流视频,但要做到无网络延迟。幸运的是,在播放视频的屏幕之前,我们的应用程序有一个进度屏幕。我希望利用这个进度屏幕的一部分时间预加载视频,以便在下一个屏幕上不延迟播放。
我想到的最有希望的方法是使用AVQueuePlayer播放2个视频,第一个视频将被静音播放(所以你看不见它,也听不到它)。根据我在SO上读到的,当第n个视频即将完成时,AVQueuePlayer会缓存第n+1个视频。
以下是我的代码:
这段代码可以播放我的第一个视频(为了调试,我有一个带有计数音轨的视频),但当到达结尾并进入下一个屏幕时(在playerItemDidReachEnd中),我的真实视频不会立即播放。
为确保我的URL正确,我在列表中颠倒了blackVideoItem和realVideoItem,并听到了我“真实”视频的音轨。
我在SO上搜索了很多,似乎没有一种方法可以无延迟地播放流视频。希望我错了。
我想到的最有希望的方法是使用AVQueuePlayer播放2个视频,第一个视频将被静音播放(所以你看不见它,也听不到它)。根据我在SO上读到的,当第n个视频即将完成时,AVQueuePlayer会缓存第n+1个视频。
以下是我的代码:
NSString *blackVideoPath = [[NSBundle mainBundle] pathForResource:@"black10-counting" ofType:@"MOV"];
AVPlayerItem *blackVideoItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:blackVideoPath]];
AVPlayerItem *realVideoItem = [AVPlayerItem playerItemWithURL:_videoWithEffectsURL];
NSArray *theItems = [NSArray arrayWithObjects:blackVideoItem, realVideoItem, nil];
AVQueuePlayer *theQueuePlayer = [AVQueuePlayer queuePlayerWithItems:theItems];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[theItems firstObject]];
AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:theQueuePlayer];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];
[theQueuePlayer play];
这段代码可以播放我的第一个视频(为了调试,我有一个带有计数音轨的视频),但当到达结尾并进入下一个屏幕时(在playerItemDidReachEnd中),我的真实视频不会立即播放。
为确保我的URL正确,我在列表中颠倒了blackVideoItem和realVideoItem,并听到了我“真实”视频的音轨。
我在SO上搜索了很多,似乎没有一种方法可以无延迟地播放流视频。希望我错了。