使用AVPlayer在iphone上播放许多不同的视频
发布时间:2020-12-14 17:53:13 所属栏目:百科 来源:网络整理
导读:我正在使用AVFoundation为iOS定制视频播放器.我们的想法是能够通过手势切换到不同的视频(点按,滑动等等).现在玩家在模拟器上完美运行,但是当我在实际设备上测试时,在3或4次滑动后视图变为空白.我甚至为我的播放器创建了播放控件,当视图变为空白时,这些控件正
我正在使用AVFoundation为iOS定制视频播放器.我们的想法是能够通过手势切换到不同的视频(点按,滑动等等).现在玩家在模拟器上完美运行,但是当我在实际设备上测试时,在3或4次滑动后视图变为空白.我甚至为我的播放器创建了播放控件,当视图变为空白时,这些控件正确加载但什么都不做.有什么想法吗?
这是播放器的初始化 - (id)initWithContentURL:(NSString *)aContentURL delegate:(id)aDelegate { self = [super initWithNibName:@"NoCashMoviePlayer" bundle:nil]; if (self == nil) return nil; delegate = aDelegate; systemPath = [aContentURL retain]; contentURL = [[NSURL alloc]initFileURLWithPath:systemPath]; asset = [AVURLAsset URLAssetWithURL:contentURL options:nil]; playerItem = [AVPlayerItem playerItemWithAsset:asset]; isPaused = false; controlsHidden = false; self.player = [[AVPlayer playerWithPlayerItem:playerItem] retain]; duration = self.player.currentItem.asset.duration; return self; } 这是播放视频的代码: -(void)playMovie{ UITapGestureRecognizer *tapRecon = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(toggleControls:)]; [tapRecon setNumberOfTapsRequired:2]; [self.movieContainer addGestureRecognizer:tapRecon]; [tapRecon release]; NSLog(@"Playing item: %@",contentURL); playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; [movieContainer.layer addSublayer:playerLayer]; playerLayer.frame = movieContainer.layer.bounds; playerLayer.videoGravity = AVLayerVideoGravityResizeAspect; self.seeker.alpha = 1.0; [self.view addSubview:movieContainer]; [self.movieContainer addSubview:controls]; [self setSlider]; [player play]; player.actionAtItemEnd = AVPlayerActionAtItemEndNone; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:[player currentItem]]; } 选择要播放的剪辑的代码: -(void)viewSelect: (double) curTime{ self.myView.backgroundColor = [UIColor blackColor]; UISwipeGestureRecognizer *swipeRecognizer = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeFrom:)]; swipeRecognizer.direction = UISwipeGestureRecognizerDirectionRight; [self.myView addGestureRecognizer:swipeRecognizer]; [swipeRecognizer release]; UISwipeGestureRecognizer *leftRecognizer = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeFromLeft:)]; swipeRecognizer.direction = UISwipeGestureRecognizerDirectionLeft; [self.myView addGestureRecognizer:leftRecognizer]; [leftRecognizer release]; if(isMain){ [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationTransitionFlipFromLeft animations:^{ self.myView.alpha = 1.0; moviePlayer = [[NoCashMoviePlayer alloc]initWithContentURL:[self movieURL:vidIndex] delegate:self]; self.moviePlayer.view.frame = self.myView.bounds; self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight; [self.myView addSubview:moviePlayer.view]; }completion:^(BOOL finished) { [self.moviePlayer.player seekToTime:CMTimeMake(curTime,1)]; [self.moviePlayer playMovie]; }]; }else{ [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationTransitionFlipFromLeft animations:^{ self.otherView.alpha = 1.0; moviePlayer = [[NoCashMoviePlayer alloc]initWithContentURL:[self movieURL:vidIndex] delegate:self]; self.moviePlayer.view.frame = self.otherView.bounds; self.moviePlayer.view.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight; [self.otherView addSubview:moviePlayer.view]; }completion:^(BOOL finished) { [self.moviePlayer.player seekToTime:CMTimeMake(curTime,1)]; [self.moviePlayer playMovie]; }]; } } 最后一个手势动作: - (void)handleSwipeFromLeft:(UISwipeGestureRecognizer *)recognizer { double elapsedTime = 0.0; if(vidIndex==0){ vidIndex = 3; }else vidIndex = vidIndex --; elapsedTime = [self.moviePlayer currentTimeInSeconds]; [self.moviePlayer stopMovie]; isMain = !isMain; [self viewSelect: elapsedTime]; } 编辑:尝试使用不同的AVPlayerLayers为每个视频文件,相同的情况,在模拟器中工作,而不是在iPad上. 编辑2:我运行仪器分析核心动画性能,当视频正在播放时,它显示大约30 fps的帧速率,当播放器空白时,它一直下降到1或2 fps.这可能是可能的,但仍然,如果它有助于提供更多的光….. 编辑3:好的,我终于到了某个地方,我知道问题是什么,我有一个核心动画内存泄漏,在模拟器中它“工作”,因为计算机比iPad有更多的内存,但自iPad内存非常有限,它很快停止工作.如果有人对Core Animation漏洞有任何建议,那将会非常受欢迎. 解决方法
我终于解决了这个问题.我的设计确实很差,它的内存管理非常糟糕等等.我所做的不是发布我能做的一切,包括视图,图层,玩家,资产等,我只是创建了一种方法来更新玩家的资产和物品,回收玩家,视图,图层等.
[player pause]; contentURL = [[NSURL alloc] initFileURLWithPath:newPath]; AVAsset *newAsset = [AVURLAsset URLAssetWithURL:contentURL options:nil]; AVPlayerItem *newPlayerItem = [AVPlayerItem playerItemWithAsset:newAsset]; [player replaceCurrentItemWithPlayerItem:newPlayerItem]; [contentURL release]; 而现在它正在创造奇迹.感谢大家的帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |