摘要:本文将带你了解IOS开发入门AVPlayer的精彩使用---)网易新闻视频播放界面的另类实现,希望本文对大家学IOS有所帮助。
本文将带你了解IOS开发入门AVPlayer的精彩使用---)网易新闻视频播放界面的另类实现,希望本文对大家学IOS有所帮助。
遇到个需求需要涉及到视频播放,那么没办法,先找资料开始进一步了解下这个不熟悉的东西.一个是MP,一个是AV,MP是封装好的,用起来非常简单,但是自定义样式就基本不可能了。AVPlayer存在于AVFundation中,更接近于底层,所以灵活性更强大,废话不多说,咱们先简单写个Demo看下他的工作原理,然后模仿网易新闻写个界面出来,这里用到了一个封装的框架,如果不熟悉内部原理的同学可以先看看我写的第一个Demo,基本所有逻辑都有。
这里容我啰嗦一句:
开发中,单纯的使用AVPlayer类是无法播放视频的,需要将视频层添加到AVPLayerLayer层,这样视频才能显示出来,Layer的定义方式有两种,一种是下面这种直接使用PlayerLayer,还有一个就是自己做一个View,然后把他自身的Layer改成playerLayer
第一种方式:
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
self.playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.playerLayer];
第二种方式:
//修改当前view的 layer的 class
+(Class)layerClass
{
//AVPlayerLayer
return [AVPlayerLayer class];
}
不BB了,直接看图说话,先看看最终的效果图
只能上传2M的东东,这视频一帧一帧消耗太快了,都不敢多录了,各位大爷将就着看吧。。。。。。
不要来打我,不然我让我表哥打死你
先简单介绍下AVPlayer的用法
很多朋友应该和我一样,一开始接触视频的时候都不知道用什么东东来写,如果是大神
就直接下载Demo吧。小白来介绍下,我也第一次用
第一:初始化播放器
// 初始化播放器item
self.playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"https://flv2.bn.netease.com/videolib3/1608/30/zPuaL7429/SD/zPuaL7429-mobile.mp4"]];
self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
// 初始化播放器的Layer
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
// layer的frame
self.playerLayer.frame = self.backView.bounds;
// layer的填充属性 和UIImageView的填充属性类似
// AVLayerVideoGravityResizeAspect 等比例拉伸,会留白
// AVLayerVideoGravityResizeAspectFill // 等比例拉伸,会裁剪
// AVLayerVideoGravityResize // 保持原有大小拉伸
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
// 把Layer加到底部View上
[self.backView.layer insertSublayer:self.playerLayer atIndex:0];
第二 :给播放器加监听以及屏幕旋转的通知
// 监听播放器状态变化
[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
// 监听缓存进去,就是大家所看到的一开始进去底部灰色的View会迅速加载
[self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
//旋转屏幕通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onDeviceOrientationChange)
name:UIDeviceOrientationDidChangeNotification
object:nil
];
第三步:实现KVO的监听方法
// 监听播放器的变化属性
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<nsstring id=""> *)change context:(void *)context
{
if ([keyPath isEqualToString:@"status"])
{
AVPlayerItemStatus statues = [change[NSKeyValueChangeNewKey] integerValue];
switch (statues) {
// 监听到这个属性的时候,理论上视频就可以进行播放了
case AVPlayerItemStatusReadyToPlay:
// 最大值直接用sec,以前都是
// CMTimeMake(帧数(slider.value * timeScale), 帧/sec)
self.slider.maximumValue = CMTimeGetSeconds(self.playerItem.duration);
[self initTimer];
// 启动定时器 5秒自动隐藏
if (!self.autoDismissTimer)
{
self.autoDismissTimer = [NSTimer timerWithTimeInterval:8.0 target:self selector:@selector(autoDismissView:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.autoDismissTimer forMode:NSDefaultRunLoopMode];
}
break;
case AVPlayerItemStatusUnknown:
break;
// 这个就是不能播放喽,加载失败了
case AVPlayerItemStatusFailed:
// 这时可以通过`self.player.error.description`属性来找出具体的原因
break;
default:
break;
}
}
else if ([keyPath isEqualToString:@"loadedTimeRanges"]) // 监听缓存进度的属性
{
// 计算缓存进度
NSTimeInterval timeInterval = [self availableDuration];
// 获取总长度
CMTime duration = self.playerItem.duration;
CGFloat durationTime = CMTimeGetSeconds(duration);
// 监听到了给进度条赋值
[self.progressView setProgress:timeInterval / durationTime animated:NO];
}
}</nsstring>
AVPlayerItemStatusReadyToPlay
AVPlayerItemStatusFailed
这两个属性还比较好理解,是个人都知道,但是这个是什么鬼
AVPlayerItemStatusUnknown
内部是这么解释的
Indicates that the status of the player item is not yet known because it has not tried to load new media resources
for playback.
fk u 我英语不好,看不懂啊,估计是playerItem这个视频资源对象挂了,识别不了,暂时不知道怎么处理
第四步:调用Play er的方法观察时间变化 更新播放进度
来个官方的说话,显得我比较牛B
// 调用plaer的对象进行UI更新
- (void)initTimer
{
// player的定时器
__weak typeof(self)weakSelf = self;
// 每秒更新一次UI Slider
[self.player addPeriodicTimeObserverForInterval:CMTimeMake(1, 1) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
// 当前时间
CGFloat nowTime = CMTimeGetSeconds(weakSelf.playerItem.currentTime);
// 总时间
CGFloat duration = CMTimeGetSeconds(weakSelf.playerItem.duration);
// sec 转换成时间点
weakSelf.nowLabel.text = [weakSelf convertToTime:nowTime];
weakSelf.remainLabel.text = [weakSelf convertToTime:(duration - nowTime)];
// 不是拖拽中的话更新UI
if (!weakSelf.isDragSlider)
{
weakSelf.slider.value = CMTimeGetSeconds(weakSelf.playerItem.currentTime);
}
}];
}
// sec 转换成指定的格式
- (NSString *)convertToTime:(CGFloat)time
{
// 初始化格式对象
NSDateFormatter *fotmmatter = [[NS
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号