查看资料和开发调试
首先我试用了MPMoviePlayerController/AVPlayer两种控件都会出现闪屏情况,AVPlayer速度比MPMoviePlayerController快点,但是你调换背景色后依然能看到一闪而过那个闪屏。在网上找了很多资料什么控件写成全局变量或者属性啊、提前加载好控件啊。。。亲测无效。。。
我的解决思路
在进行视频播放时,会预先解码一些内容,而此时如果我们的App使用CPU过多,I/O读写过多时,这个过程可能要花费一点时间,也就是闪屏那一点。
上面说的很对,但是一直没有找到解决方案。
看视频时我们都能看到一种情况,视频播放开始或者加载中都会有图像显示在播放器上,而此处我想的是在我的视频播放器上面覆盖一层imageview,用于显示截取的视频第一帧图片,我想说到这里大家都明白了,很笨的方法,但是亲测效果很好,下面说一下步骤吧。。
思路&代码
image覆盖层
- (UIImageView *)topImgView
{
if (!_topImgView) {
_topImgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
_topImgView.contentMode = UIViewContentModeScaleToFill;
_topImgView.hidden = NO;
_topImgView.opaque = YES;
}
return _topImgView;
}
palyer初始化
- (void)setupPlayer{
NSURL * movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"hello" ofType:@"mp4"]];
player = [[MPMoviePlayerController alloc] initWithContentURL: movieURL];
UIImage *thumbnail = [player thumbnailImageAtTime:0.1 timeOption:MPMovieTimeOptionNearestKeyFrame];//截取视频第一帧图片
self.topImgView.image = thumbnail;
player.shouldAutoplay = NO;// 应该自动播放
[player setControlStyle:(MPMovieControlStyleNone)]; // 播放控制 : 不控制
player.repeatMode = MPMovieRepeatModeOne; // 循环播放
[player prepareToPlay];
[player.view setFrame:[UIScreen mainScreen].bounds];
player.scalingMode = MPMovieScalingModeAspectFill; // 缩放模式, 宽度或高度最小的那个等于屏幕宽或高
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startPlay) name:MPMoviePlayerLoadStateDidChangeNotification object:nil];//Posted when the network load state changes.用于开始播放
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hiddenTopImage) name:AVPlayerItemTimeJumpedNotification object:nil];/ /监听当视频开始或快进或者慢进或者跳过某段播放 用于隐藏_topImgView
[self updateSubViews];
}
- (void) startPlay{
[player play];
}
- (void) hiddenTopImage{
_topImgView.hidden = YES;
}
写的测试demo 随便粘了一点关键代码 思路就是这样、亲自去写写测测吧,如果有更好的解决方案,也希望能给我分享一下,谢谢!!!
网友评论