3

我正在尝试播放无限循环的视频剪辑。我按照 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 上。

我究竟做错了什么?

4

3 回答 3

2

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

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

于 2013-06-18T01:08:39.033 回答
1

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

于 2012-11-23T04:51:23.753 回答
0

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

于 2014-03-11T09:34:45.660 回答