AVPlayerItem在索引播放?

时间:2014-08-08 18:00:31

标签: ios objective-c indexing avplayer icarousel

我有一个ICarousel正确显示我的所有视频,但是当我按下播放按钮时,它将播放下一个索引上的视频而不是我正在使用的索引。

我希望它能够在指定的索引处播放,我尝试将[sender tag]作为索引传递,并尝试使用相应的播放项在该索引处创建另一个子视图。

似乎什么都没有用,这是什么原因?!!

这是我的viewForItemAtIndex

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view
{
      AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:[_videoURLS objectAtIndex:index]] options:nil];

     //Video Player View
     _videoView = [[UIView alloc] initWithFrame:CGRectMake(0,0, mainViewWidth, 220)];
     _videoView.backgroundColor = [UIColor colorWithRed:123/255.0 green:123/255.0 blue:123/255.0 alpha:1.0];
     _videoView.center = CGPointMake(100, 170);//170
     _videoView.tag = 20;
     [view addSubview:_videoView];

    //Play Button
     _playButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60.0f, 60.0f)];
     [_playButton setBackgroundImage:[UIImage imageNamed:@"play-icon-grey.png"] forState:UIControlStateNormal];
     [_playButton addTarget:self action:@selector(playVideo:) forControlEvents:UIControlEventTouchUpInside];
     _playButton.center = CGPointMake(100, 160);
     _playButton.tag = index;
     [view addSubview:_playButton];

      //AV Asset Player
     AVPlayerItem * playerItem = [[AVPlayerItem alloc] initWithAsset:asset];
     _player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
     AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
     playerLayer.frame = _videoView.bounds;
     //        [playerLayer setFrame:_videoView.frame];
     [_videoView.layer addSublayer:playerLayer];
     [_player seekToTime:kCMTimeZero];

     return view;
}

这会显示甚至播放,但它不会播放当时专注的正确播放。 我已经被困在这几天了,任何帮助都表示赞赏!!

3 个答案:

答案 0 :(得分:0)

您可以使用playVideo方法更新代码吗?可能是这个方法的问题。检查从这个方法中选择的url是否与我们在index中的视图中返回的url相同。!!

答案 1 :(得分:0)

首先,如果可能,我会使用- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;代替按钮。第二 - 你没有重复使用视图并且总是创建新的(并且你总是为视图设置相同的标签,这可能是播放错误视频的原因),这样性能可能会受到影响。

我会做什么: - 创建UIView子类(使用xib文件或以编程方式创建的接口 - 这是您环境中的首选项和/或标准问题),创建公共方法,如- (void)configureWithAsset:(AVURLAsset *)asset- (void)configureWithURL:(NSURL *)url,并在此方法中传递所需信息。在实现中,您应该使用所需的视频初始化AVPlayer。 在- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view中调用此方法(您可以将UIView更改为您的自定义子类名称,因此您不需要强制转换) - 就像这样

- (VideoView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(VideoView *)view
{
    if (view == nil) {
        view = [VideoView new]; // you may need to create another initializer
    }
    NSURL *url = get URL here;
    [view configureWithURL:url];
    return view;
}

然后当你需要播放视频时,请拨打[videoView playVideo](你也需要创建它,它应该只调用播放器对象上的播放)。

答案 2 :(得分:0)

与创建iCarousel的人取得联系后,我找到了解决方案。

只需在selctedItemAtIndex中而不是在主视图中创建AVPlayer图层。 这允许我使用

_carousel.currentItemView && _carousel.currentItemAtIndex 

将图层分配给特定轮播视图的子视频视图