如何使用AVFoundation循环播放视频而不会出现不必要的暂停?

时间:2012-11-17 08:04:09

标签: ios video avfoundation avplayer

我正在尝试播放无限循环的视频片段。我按照Apple建议的方式这样做;通过设置由AVPlayerItemDidPlayToEndTimeNotification触发的通知:

@property(nonatomic) AVPlayer *videoPlayer;
@property(nonatomic) AVPlayerItem *videoPlayerItem;

-(void)loadVideo
{
    NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:extension];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    NSString *tracksKey = @"tracks";

    [asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler:
    ^{
        dispatch_async(dispatch_get_main_queue(),
        ^{
            NSError *error;
            AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];

            if (status == AVKeyValueStatusLoaded)
            {
                [self setVideoPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
                [videoPlayerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
                [[NSNotificationCenter defaultCenter] addObserver:self
                                                         selector:@selector (videoPlayerItemDidReachEnd:)
                                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                                           object:videoPlayerItem];
                [self setVideoPlayer:[AVPlayer playerWithPlayerItem:videoPlayerItem]];
                [scenePlayerView setVideoPlayer:videoPlayer];
            }
        });
    }];
}

触发后,这会调用我的方法来有效地倒回并再次播放剪辑:

-(void)videoPlayerItemDidReachEnd:(NSNotification *)notification
{
    [videoPlayerItem seekToTime:kCMTimeZero];
    [videoPlayer play];
}

问题是,每次点击此方法并循环回到开头时,视频播放中会有短暂但可见的暂停。

视频片段是H.264,并已在其他播放器中经过测试,以确保其内容中没有可见的“跳过”内容。这一切都发生在iOS6的模拟器和iPad2和iPad3上。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

不幸的是,实际上目前无法使用AVPlayer,因为在每种情况下都会在AVPlayer中开始播放时出现不可避免的打嗝。所以“杂乱”的黑客似乎是解决这个问题的唯一方法,使用多个AVPlayers等。

答案 1 :(得分:1)

你有两种可能的方法来获得一个没有毛刺的真正专业的循环(AVPlayer本身不起作用)。首先,您可以拍摄原始视频并将其解码为一系列RGB帧(图像)。然后对新的h.264视频进行编码,并将帧提供给比第一个更长的h.264视频。例如,您可以对10秒循环剪辑进行6次编码,以制作一个持续1分钟或6 * 5的剪辑,以便在循环重新启动时制作一个可以播放5分钟但没有毛刺的剪辑。然后,打开较长的剪辑并使用AVPlayer播放它,它不会在一段时间内出现故障。

第二种方法是使用已经处理无缝循环的现有库。您可以查看我的图书馆,查看基本相同问题iphone-smooth-transition-from-one-video-to-another的答案。链接答案中示例中的字符使用一个视频剪辑的重复“循环”,当没有按下任何按钮时,该循环会反复循环。

答案 2 :(得分:0)

我设法让它与两个AVPlayer一起工作,两个AVPlayerLayer添加到两个不同的视图中(我尝试添加到同一个视图中,上面的一个被卡住了一段时间),并在这两个视图之间切换alpha值。