小工具      在线工具  汉语词典  css  js  c++  java

AVPlayer进行IOS视频开发的基本使用

IOS系统方法&&常用控件&&GitHub资源学习 额外说明

收录于:43天前

1.名词解释:(1)AVPlayer负责控制播放(管理和调整)

使用AVPlayer时需要注意的是AVPlayer本身不能显示视频,而是AVPlayerLayer显示视频。 AVPlayerLayer继承自CALayer,添加到view.layer后即可使用。

-(空白的) 玩; - 玩

-(空白的) 暂停; - 暂停

(2)AVPlayer层屏幕显示播放----查看

(3)AVPlayerItem提供数据---数据源

AVPlayItem相当于Model层,包含Media信息和播放状态,并将这些数据提供给视频观察者。

status:玩家状态变化

loadTimeRange:缓存大小

2. 播放视频的全部步骤。

(1)首先获取视频的URL

(2)根据URL创建AVPlayerItem

(3) 向AVPlayer提供AVPlayerItem

(4)AVPlayerLayer显示视频。

(5)AVPlayer控制视频播放、暂停、跳转等。

(6) 获取播放时的缓冲进度和播放进度。

(7) 视频播放完成后做什么,是暂停、循环还是停留在图像的最后一帧。

3.初始化一个AVPlayer进行播放

#pragma mark -- life cycle
- (void)createAVPlay
{
    // 监测设备方向
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    
    //旋转屏幕通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(onDeviceOrientationChange)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
    //播放完成通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(avPlayDidEnd)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:nil];

    /* 1. 初始化一个View,是用来放置播放器用的,此处是self
       2. 初始化播放器AVPlayerItem,用来设置播放视屏的URL或者本地视屏资源
       3. 初始化一个AVPlayer对象,来接收AVPlayerItem传过来的资源
       4. 初始化一个AVPlayerLayer对象,将AVPlayer对象叠加在其上面
       5. 将AVPlayerLayer对象添加到self的layer层上
     */
    // 初始化播放器item
    self.playerItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:self.movieUrlString]];
    // 监听播放器状态变化
    [self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    // 监听缓存大小
    [self.playerItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
    // 初始化一个AVPlayer
    self.player = [[AVPlayer alloc] initWithPlayerItem:self.playerItem];
    // 初始化播放器的Layer
    self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
    //此处为默认视频填充模式
    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    // 添加playerLayer到self.layer
    [self.layer insertSublayer:self.playerLayer atIndex:0];
    
    /* layer的填充属性
     AVLayerVideoGravityResizeAspect 等比例拉伸,会留白
     AVLayerVideoGravityResizeAspectFill // 等比例拉伸,会裁剪
     AVLayerVideoGravityResize // 保持原有大小拉伸
      */
}

// 监听播放器的变化属性
- (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:
            {
                [self hiddenLoading];
                
                [self setNeedsLayout];
                [self layoutIfNeeded];
                // 5. 添加playerLayer到self.layer
                //[self.layer insertSublayer:self.playerLayer atIndex:0];
                
                // 最大值直接用sec,以前都是
                // CMTimeMake(帧数(slider.value * timeScale), 帧/sec)
                
                [self.avPlayControlView setSliderMaxValue:CMTimeGetSeconds(self.playerItem.duration)];
                [self initTimer];
                
                // 启动定时器 5秒自动隐藏
                if (!self.autoDismissTimer)
                {
                    self.autoDismissTimer = [NSTimer timerWithTimeInterval:8.0 target:self selector:@selector(autoHiddenControlView) userInfo:nil repeats:YES];
                    [[NSRunLoop currentRunLoop] addTimer:self.autoDismissTimer forMode:NSDefaultRunLoopMode];
                }
            }
                break;
            case AVPlayerItemStatusUnknown:
                NSLog(@"--AVPlayerItemStatusUnknown");
                break;
            case AVPlayerItemStatusFailed:
                NSLog(@"--AVPlayerItemStatusFailed");
                break;
                
            default:
                break;
        }
    }
    else if ([keyPath isEqualToString:@"loadedTimeRanges"]) // 监听缓存进度的属性
    {
        // 计算缓存进度
        NSTimeInterval timeInterval = [self availableDuration];
        // 获取总长度
        CMTime duration = self.playerItem.duration;
        
        CGFloat durationTime = CMTimeGetSeconds(duration);
        // 监听到了给进度条赋值
        [self.avPlayControlView setProgress:timeInterval / durationTime];
    }
}




 本工程的演示demo地址  点击打开链接




. . .

相关推荐

额外说明

获取某个年份区间中的一个随机时间

/** * 获取某个年份区间中的一个随机时间 * * @param startYear * @param endYear * @return * @throws ParseException

额外说明

uniapp——发送get请求

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技am

额外说明

Java后台——点餐小程序在服务器上运行点餐系统供别人访问

QQ 1274510382 Wechat JNZ_aming 商业互捧 QQ群538250800 技术搞事 QQ群599020441 技术合作 QQ群152889761 加入我们 QQ群649347320 纪年科技aming 网络安全 ,深度学习,嵌入式

额外说明

Vmware虚拟机克隆后的网络配置

我们在VMware环境中经常会有复制虚拟机的操作,比如我们搭建集群等等,而在复制完毕,配置网络的时候,我们总会发现这样那样的问题,网卡不管怎么样,就是起不来。下面我来跟大家分享一下我的一个处理过程。 1.修改网卡配置文件,使用和源主机(源主机就是克隆的母

额外说明

vue中点击空白处改变dom状态实现显隐,监听dom(addEventListener)

需求来源:点击铃铛之后弹出右侧抽屉,实现文件下载 现在是点击小铃铛出现弹框没问题,点击关闭图标关闭弹框也没问题,但是点击空白区域消失不了,这个时候需要dom监听属性document.addEventListener来实现需求了 主要是用document.

额外说明

JVM(Java虚拟机)

描述: 虚拟机是一种虚拟的,逻辑上实现计算机一些功能的,抽象化的计算机。 Java虚拟机(Java Virtual Machine 简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,Java虚拟机屏蔽了与具体操作系统平台相关的信息

额外说明

机器人过程自动化(RPA)入门 7. 处理用户事件和助手机器人

在UiPath中,有两种类型的Robot用于自动化任何流程。一个是后台机器人,它在后台工作。它独立工作,这意味着它不需要用户的输入或任何用户交互。另一个是前台机器人,也被称为助理机器人。 本章介绍前台机器人。在这里,我们将了解自动化过程中通过简单按键、单

额外说明

echarts的可视化页面数据累加

  -博主:小猫娃来啦 -文章核心:echarts的可视化页面数据累加 目录 效果展示 目标 实现 完整代码,复制直接运行 对于可视化页面数据累加的思考 真实项目中的实现思路 引入 ECharts 库 准备数据 创建图表实例 配置图表选项 渲染图表 更新

额外说明

Windows系统因找不到msieftp.dll文件导致程序异常的解决办法

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个msieftp.dll文件(

额外说明

wordpress添加媒体_如何在WordPress中添加Facebook赠品以提高参与度

WordPress 添加媒体 您想在增加 Facebook 粉丝的同时提高网站的参与度吗? 您想在增加 Facebook 粉丝的同时提高网站参与度吗? 如果您的答案是肯定的,那么您需要举办一场 Facebook 竞赛。赠品可以帮助引导用户关注您的 Fac

ads via 小工具