【问题标题】:Smooth video looping in iOSiOS 中流畅的视频循环播放
【发布时间】:2011-12-10 23:45:29
【问题描述】:

谁能推荐一种方法来在 iOS 中实现视频剪辑的完全流畅和无缝循环?我尝试了两种方法,当视频循环播放时,这两种方法都会产生短暂的停顿

1) AVPlayerLayer 与 playerItemDidReachEnd 通知设置为 seekToTime:kCMTimeZero

我更喜欢使用 AVPlayerLayer(出于其他原因),但这种方法会在循环之间产生大约一秒的明显停顿。

2) 带有 setRepeatMode:MPMovieRepeatModeOne 的 MPMoviePlayerController

这会导致较小的停顿,但仍不完美。

我不知道从这里去哪里。谁能推荐一个灵魂?

【问题讨论】:

  • 哇,没有回应。我想这在 iOS 中一定不是一件容易的事。我正在研究一种涉及两个交替 AVPlayer 的解决方法,但这只是一种解决方法。仍然希望有一种方法可以流畅地循环播放单个剪辑。
  • 运气好吗?我现在也正在处理这个问题。我在循环之间跳过,并且视频在 5-6 个循环后永久冻结。
  • 经过多次循环后,我在 IOS5 中也遇到了 setRepeatMode:MPMovieRepeatModeOne 冻结问题
  • 好吧,伙计们,这已经跑题了,但我修复了 IOS5 中奇怪的冻结问题,用于重复模式的视频。如果您观察 MPMoviePlayerPlaybackStateDidChangeNotification 并简单地在选择器中执行 NSLOG 语句,则视频不再冻结。我正在向 Apple 提交错误
  • @SamBrodkin 这对我不起作用 :( 我希望看到对此的修复。对于 MP4 来说似乎比 M4V 更糟糕。

标签: ios mpmovieplayercontroller ios5 movie avplayer


【解决方案1】:

我同意@SamBrodkin 的发现。

[[NSNotificationCenter defaultCenter]
    addObserver: self
    selector: @selector(myMovieFinishedCallback:)
    name: MPMoviePlayerPlaybackStateDidChangeNotification
    object: m_player];

-(void) myMovieFinishedCallback: (NSNotification*) aNotification
{
    NSLog( @"myMovieFinishedCallback: %@", aNotification );
    MPMoviePlayerController *movieController = aNotification.object;
    NSLog( @"player.playbackState = %d", movieController.playbackState );
}

也为我修复了 iOS 5 上的非循环问题。

【讨论】:

    【解决方案2】:

    我刚刚在我的 iPad 3 上运行 iOS 5.1.1,基础 SDK iOS 5.1

    设置电影播放器​​时,将重复模式设置为 MPMovieRepeatModeNone 然后添加通知

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(moviePlayerDidFinish:)
                                                     name:MPMoviePlayerPlaybackDidFinishNotification
                                                   object:self.moviePlayer];
    

    然后设置您的选择器以在电影播放完毕时进行过滤

    - (void)moviePlayerDidFinish:(NSNotification *)note {
        if (note.object == self.moviePlayer) {
            NSInteger reason = [[note.userInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] integerValue];
            if (reason == MPMovieFinishReasonPlaybackEnded) {
                [self.moviePlayer play];
            }
        }
    }
    

    Apple 对 MPMoviePlayerController 在从 iOS 4 更改为 iOS 5 时处理加载电影文件的方式进行了一些较大的更改,所以我不知道这个方法在他们发布 iOS 6 时是否有效

    【讨论】:

      【解决方案3】:

      要查看显示背景视频无缝循环(来自动画 GIF)和在一对前景角色动画(带 alpha 通道)之间切换的示例,请查看 seamless-video-looping-on-ios。我过去曾尝试使用 AVPlayer,但不得不放弃与 AVPlayer 相关的解决方案,因为它们效果不佳。另请参阅此 SO 问题 iphone-smooth-transition-from-one-video-to-another

      【讨论】:

        【解决方案4】:

        我调查了与原始发布者报告的相同的问题(循环中的小停顿破坏了无缝性)。幸运的是,我有另一个没有这种行为的视频样本,后来才发现解释/不同:

        音轨。

        我怀疑声音初始化很慢(路由?)。

        删除音轨对我来说是最简单的解决方案(不需要声音),但我必须进一步挖掘(音频混合选项和测试已发布在此线程中的解决方案)。

        埃里克

        【讨论】:

          【解决方案5】:

          为避免视频倒带时出现间隙,在合成中使用同一资产的多个副本对我来说效果很好。

          AVURLAsset *tAsset = [AVURLAsset assetWithURL:tURL];
          CMTimeRange tEditRange = CMTimeRangeMake(CMTimeMake(0, 1), CMTimeMake(tAsset.duration.value, tAsset.duration.timescale));
          AVMutableComposition *tComposition = [[[AVMutableComposition alloc] init] autorelease];
          for (int i = 0; i < 100; i++) { // Insert some copies.
              [tComposition insertTimeRange:tEditRange ofAsset:tAsset atTime:tComposition.duration error:nil];
          }
          AVPlayerItem *tAVPlayerItem = [[AVPlayerItem alloc] initWithAsset:tComposition];
          AVPlayer *tAVPlayer = [[AVPlayer alloc] initWithPlayerItem:tAVPlayerItem];
          

          【讨论】:

          • 链接已损坏,建议的解决方案也不适用于真正的无缝循环。
          猜你喜欢
          • 2021-12-05
          • 2015-09-28
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2017-04-02
          • 2013-08-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多