怎么玩&当UITableView滚动时,在UITableView中暂停AVPlayer?

时间:2016-05-26 12:57:33

标签: objective-c video-streaming avplayer avplayerviewcontroller

我希望在像Instagram这样的UITableView中显示视频,这些视频将在单元格可见时自动播放,并在单元格从屏幕消失时暂停。我到处尝试找到解决方案,但我发现的是非常复杂的代码甚至无法理解。此时屏幕上显示两个单元格。只播放一个视频,其他所有视频都应停止播放。

我还需要关心内存泄漏。所以我不知道在哪里可以分配AVPlayerViewController。我处理一系列URL来播放视频。

请详细给我完美的解决方案。帮助将不胜感激。

编辑:

此方法提供显示在屏幕上的索引数组

-(BOOL)isRowVisible :(NSIndexPath*)indexPath {
    NSArray *indexes = [tblHome indexPathsForVisibleRows];
    for (NSIndexPath *index in indexes) {
        if (index.row == indexPath.row) {
            return YES;
        }
    }

    return NO;
}

在cellForRowAtIndexpath方法中 -

BOOL visibleCell = [self isRowVisible:indexPath];
if(visibleCell == YES)
{
    //if(!avpController)
    {
        avpController = nil;
        avpController= [[AVPlayerViewController alloc] init];
        avpController.player=videoPlayer;
       // avpController.view.frame = CGRectMake(0, 50, SCREEN_WIDTH, 100); //CGRectMake(0, userDetailView.frame.origin.y + userDetailView.frame.size.height +5, SCREEN_WIDTH, 200) ;
        avpController.view.frame = videoView.bounds;

        [videoView addSubview:avpController.view];

    }

    NSURL *url= [NSURL URLWithString:[arrVideo valueForKey:@"video_path"]];
    videoPlayer = [AVPlayer playerWithURL:url];
    [videoPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
    [videoPlayer play];
}

2 个答案:

答案 0 :(得分:0)

首先,您需要一个基于UITableViewCell的自定义单元格。在其中你应该有一个方法,在调用时创建一个AVPlayer(也是一个类属性),例如:

- (void) createPlayerWithURL:(NSURL)url {
    AVAsset *asset = [AVAsset assetWithURL:url];
    self.playerItem = [AVPlayerItem playerItemWithAsset:asset];
    self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    [self.playerLayer setFrame:self.view.layer.bounds];
    [self.view.layer addSublayer:self.playerLayer];
    [self.player play];
}

在自定义单元格标题文件中添加指向该方法的链接,然后从cellForRowAtIndexPath调用它,并传入视频的网址。

您可以使用另一种方法检查单元格何时退出视图:tableView:didEndDisplayingCell:forRowAtIndexPath:。在tableview上使用该方法来获取单元格对象 - 您只需调用即可停止播放器,即[cell.player pause];

答案 1 :(得分:0)

您应该使用# install.packages("devtools") devtools::install_github("smac-group/gmwm") # Set seed for reproducibility set.seed(13412) # Specify a SARIMA(2,1,1)(1,1,1)[12] mod = SARIMA(ar=c(.3,.5), i=1, ma=.1, sar=.2, si = 1, sma = .4, s = 12, sigma2 = 1.5) # Generate the data xt2 = gen.gts(mod, 1e3) # Validate output arima(xt2, order=c(2,1,1), seasonal=list(order=c(1,1,1), period = 12)) (或与Call: arima(x = xt2, order = c(2, 1, 1), seasonal = list(order = c(1, 1, 1), period = 12)) Coefficients: ar1 ar2 ma1 sar1 sma1 0.3491 0.4796 0.0903 0.2106 0.4165 s.e. 0.0737 0.0563 0.0856 0.0551 0.0511 sigma^2 estimated as 1.555: log likelihood = -1621.37, aic = 3254.75 相关联的其他委托方法)来跟踪- (void)scrollViewDidScroll:(UIScrollView *)scrollView的移动。然后,您应该能够判断scrollview何时移出屏幕。