在UITableViewCell中播放MPMoviePlayerController会导致应用程序冻结和崩溃

时间:2015-07-08 22:44:05

标签: ios uitableview mpmovieplayercontroller

在我正在使用的应用中,我们向MPMovePlayerController添加UITableViewCell,然后自动播放。问题是,调用prepareToPlay和/或play导致应用程序冻结,CPU最大化,RAM不断增加,应用程序当然会在一段时间后崩溃。如果我评论prepareToPlayplay没有出现,但我看到的只是一个没有播放控件的黑盒子。

我们在MPMoviePlayerController中创建cellForRowAtIndexPath并将其存储到一个数组中,因为我们可能在表格中有多个视频,并且需要能够在点按一个视频或停止播放时播放正确的视频一经请求。第一次加载表格时,视频会毫无问题地加载和播放。用户可以通过模态视图控制器演示添加视频,该视频会在将视频添加到数据源后重新加载表格。用户添加新视频后,问题才会出现。

我尝试在单元格中存储播放器的属性,但这并没有解决问题。我在设置stop之前尝试拨打contentURL,如其他地方所建议的那样,这也没有帮助。还尝试了4种不同的视频,每种视频都是不同的格式,以防它是一个损坏的视频。我不确定问题是什么。

//Table view controller:
@interface {
    NSMutableArray *arrayOfMoviePlayers;
}

viewDidLoad {
    arrayOfMoviePlayers = [NSMutableArray new];
}

cellForRowAtIndexPath {
    MyTableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];

    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]init];
    [arrayOfMoviePlayers addObject:moviePlayer];

    cell = [[MyTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell" withDictionary:dict withMoviePlayer:moviePlayer];
    return cell;
}

//Cell subclass:
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier withDictionary:(NSDictionary*)dict withMoviePlayer:(MPMoviePlayer *)moviePlayer {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        moviePlayer.view.frame = self.contentView.bounds;
        [self.contentView addSubview:moviePlayer.view];

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
            dispatch_async(queue, ^{
                NSString* fileURL = dict[@"video"][@"url"]; //may be remote or local
                dispatch_async(dispatch_get_main_queue(), ^{
                    [moviePlayer stop];
                    [moviePlayer setContentURL:[NSURL fileURLWithPath:fileURL]];

                    //next lines cause high CPU, RAM, eventual crash
                    [moviePlayer prepareToPlay];
                    [moviePlayer play];
                });

            });
    }
    return self;
}

崩溃的一些细节:

Crashed Thread:        0  Dispatch queue: com.apple.main-thread
Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_PROTECTION_FAILURE at 0x00007fff5291bd80

1 个答案:

答案 0 :(得分:0)

问题是由于视频文件的网址无效。虽然URL存在,但它不正确。