ios - 如何使用 AVFoundation 循环播放视频,最后没有不必要的停顿?

标签 ios video avfoundation avplayer

我正在尝试播放无限循环的视频剪辑。我按照苹果推荐的方式这样做;通过设置由 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 上。

我做错了什么?

最佳答案

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

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

关于ios - 如何使用 AVFoundation 循环播放视频,最后没有不必要的停顿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13428831/

相关文章:

ios - 如何取消 UIViews 基于 block 的动画?

ios - Viewcontroller 没有命名的成员

ios - 如何在iOS中隐藏视频停止播放按钮?

video - 实时视频流中的 B 帧

cocoa - 无法让 AVPlayerLayer 在 NSView 中显示视频

ios - AVCaptureVideoDataOutput 和图像在屏幕上的显示大小

IOS:向后移动两个 View

ios - 如何使用 Swift 保存从 tableView 上的文本字段收到的用户答案

java - 如何使用Java将ogv视频文件转换成Mp4视频格式

ios - 同步 AVAudioPlayerNode 并开始录制 AVAudioEngine