iOS流媒体开发之二:滑入手势控制音量、亮度和速度葡京网上娱乐场

尊重知识,转发请注解出处:iOS流媒体开发之二:滑出手势控制音量、亮度和进度

自家插足过管理类讲座/协会,不过都忘了,也被迫买过局部管理类图书,可是也都没看,我一心是按部就班过去经历、教训统计。当然每个集体都有破例的风骨、氛围,可能我所说并不有所普适性。


1、要求成员必须定期工作总计

概要

自家一向不相信网上或者学习别人所得的阅历来指点工作,或者更标准地说:我始终认为只要我们任谁做一件事,把所做工作细节、境遇的艰苦、思索的解决思路、思维转变以及吸引思考转变/突破的场地、所得经验统统在做完此项工作时总括出来,就肯定能超越网上拥有的并存材料。

看样子小说的标题,小伙伴们大致会有两种反应:①这和流媒体技术没关系吧②网上有很多这些职能的兑现方案。
1、对此第一种反应,从开发者的角度看这多少个的确不属于流媒体技术层面,可是对于用户来讲那多少个曾经是看录像时理所当然应该有些职能,密不可分,鉴于用户就是上帝,所以这么些相对属于流媒体范畴.
2、第二种反应确实是实情,可是能真的周密兑现的不多。有6s
Plus的同伙可以打开爱奇艺或者天涯论坛乐乎,随便打开一个视频,手势增大音量出现音量不能调节到最大的bug,会剩余4格音量,只好先调节到很小的高低再一次增大才足以到最大音量,当然那些是系统在6s上的一个bug,但不用不可能解决,即使是爱奇艺和博客园也未尝全面兑现(您看到此小说的时候有可能早已修复此bug)。还有一点一般的实现方案是添加UIPanGestureRecognizer手势,这么些方案一经只是简单的视频播放器或者写一个Demo完全没问题,可是放在一个略带复杂点的录像播放器会挑起众多题目,后边再说,由此我这边提供另一种方案。

自己的说辞很简单:假使你有着一定的网络搜索能力,可以找到确切的上学资料并且参与自己的构思做了三次肯定无法比“站在前任肩膀”上的功用更差。最要害的是,网上的素材往往没有实施细节或者给出的相比较模糊的醒悟,你在推行进程中总会遇见网上资料不涉及的根底细节,那么这一部分细节你在执行进程中是不是能够跨过?

果壳网知乎手势调节音量bug.png

一经可以跨过,这您是否可以统计出比网上资料更好的情节?

思考

倘若可以,这自己就觉得最起码在此项工作中成员水平现已高达当时场馆下top级别,这样你就会采取总计的契机系统性梳理原有的干活内容,进而上升一个冲天系统性看待所做工作,你也就点亮了一个技能点。

以此意义对于有一对开发经历的人的话并不难,只要勤快点,别遭受点难题没怎么考虑就去找第三方库,都可以靠自己弄个八九不离十。我这边想经过那些效用向大家介绍我平常解决一些题材的心路历程,希望能帮到我们的不光是技术本身,还有一种缓解问题的力量。对于爱好“废话少说,间接上代码”的伙伴,这篇作品可能会让您有点不舒服,因为在我看来代码一文不值,值钱的是我们的思辨,别急,大家渐渐来。

刚起头自我是指向让同事利用工作机会升迁能力的想法,用相比较系统的传道是:把项目成功交付看作能力建设的副产品。

  • 剖析问题,抽离本质
    当大家拿到这么些要求的时候,首先不要想自己用哪些类可以兑现,我要添加在哪个view上,我们首先要分析出这多少个题材的本色,对于手势调节这些题目的真相很简短,就是用户左右、上下滑动时依照手指运动的大势和偏移量改变音量等装置。
  • 捋顺逻辑,列出方案
    解析出问题的真相后,还是不要去想和代码有关的政工,接着我们要研讨处理问题的逻辑并付出一个当下总的来说可行的方案。我平时会找一张白纸,画一些草图协助记念和透亮,当然曾反复想用xmind等考虑导图,不过发现如故踏踏实实的白纸适合我,小伙伴们可以遵照自家采取,只要能协理捋顺思路就可以了。
    第一步我们要检测到手指在屏幕上的滑动,可以使用UIPanGestureRecognizer手势,前面说了这个会引起很多问题,比如一个视频播放器不仅仅有滑动手势还是单击、双击、左滑退出UINavigationController,各种手势会冲突,其次我们有时会在拖动前或者结束后处理一些事情在再执行拖动,虽然UIPanGestureRecognizer有UIGestureRecognizerStateBegan、UIGestureRecognizerStateEnded这些状态,可是手指点击屏幕没有滑动的时候无法触发,因此我最后弃用这个方案,改为使用- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;系列方法,具体实现看后面代码; 第二步要判断用户向哪个方向移动了,以便调用相应的设置,这可以根据手指在上下左右的偏移量来计算,我的方案是设置一个初始偏移量的数值,比如30,上下左右哪个方向偏移量先到达30,手势就设定为对应的方向; 第三步就是调用对应的方法去改变音量、亮度和进度了,具体实现看后面。

但新兴乘机成员离职,我更发现有助于这件事情的功利:要求成员写充满细节和上升低度的做事总括,对于新同事神速上手、打破执行力差的状况极有裨益。成员流动状态是不可制止的,同时由于我们尚无完善的干活对接制度,离职同事的干活总括对于减少新同事上手时间、制伏焦虑症极有益处。

行动

自我仍然觉得最好的法子根本不是工作交接,因为假如将要离职的同事不是在做同一件事的话,他传递的信息一定没有他碰巧做完时总括的水准更高,他也亟需再行进入状态记忆,找回做这件事的觉得。

逻辑通了,方案有了,现在开头走路吧,首先你要有个能够播放录像demo,最好是点播录像,可参考上篇博文:iOS流媒体开发之一:总括系统提供的接口,这里不赘述。

2、定期开会、交换

  • 自定义一个UIButton
    我们需要在视频上添加一个晶莹剔透的button来捕捉和响应用户的点击滑动屏幕的风波,同时在.h文件中声称一个代理,向相应的页面传递自定义button的响应事件,代码如下:

我专门讨厌会议,所以自己在此之前很少协会部门会议,六个月能把部门人士统一联谊开会就是高频率。我原先错误的思想意识是:大家都坐在一起,你们互动之间必然知道对方在做什么样,假设急需怎样扶助直接找对方不就行了?有必要通过议会这样没用的联系情势让自身把你们协会起来?

.h文件

当真有必不可少,每个人的天性真的不等同,假若自己有事肯定会随便找人,我从不管你是如何部门,我清楚您是做什么样,我需要哪些帮助,我直接找你援助、一起推进即可。可是一人多,团队内很难维持像本人同一的做事风格,他们觉得自己从未有过权力,又怕打扰外人、影响她们所做工作进度。而且后来我们批判我的时候,告诉我一个这个战败的业务:成员大约知道其别人的做事性质,可是并不知道具体做事内容,在一直不充足精晓基础下,我们很难和对方的办事联系起来,所以众多气象当然两人干活得以联手开展,由于联系不足,双方也是各做各的。

    #import <UIKit/UIKit.h>

    @protocol ZYLButtonDelegate <NSObject>

    /**
     * 开始触摸
     */
    - (void)touchesBeganWithPoint:(CGPoint)point;

    /**
     * 结束触摸
     */
    - (void)touchesEndWithPoint:(CGPoint)point;

    /**
     * 移动手指
     */
    - (void)touchesMoveWithPoint:(CGPoint)point;

    @end

    @interface ZYLButton : UIButton

    /**
     * 传递点击事件的代理
     */
    @property (weak, nonatomic) id <ZYLButtonDelegate> touchDelegate;

    @end

据此后来我吸取教训,每一周定期开会,我不会通过微信群的艺术下发公告,我必然会听从大家公司的要求规范在日事清中经过日程下发会议通报,为了保证功效,会在布告中写明:

.m文件
#import “ZYLButton.h”

1)会议目标:

    @implementation ZYLButton

    //触摸开始
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        [super touchesBegan:touches withEvent:event];
        //获取触摸开始的坐标
        UITouch *touch = [touches anyObject];
        CGPoint currentP = [touch locationInView:self];
        [self.touchDelegate touchesBeganWithPoint:currentP];
    }

    //触摸结束
    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        [super touchesEnded:touches withEvent:event];
        UITouch *touch = [touches anyObject];
        CGPoint currentP = [touch locationInView:self];
        [self.touchDelegate touchesEndWithPoint:currentP];
    }

    //移动
    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event {
        UITouch *touch = [touches anyObject];
        CGPoint currentP = [touch locationInView:self];
        [self.touchDelegate touchesMoveWithPoint:currentP];
    }

    @end

2)会议时间:

注意:之所以选择UIButton有2点原因: 1、不用手动开启userInteractionEnabled用户交互 2、同时可以很方便的为UIButton添加Target,不需要像UIView那样在再定义一个UITapGestureRecognizer,当然UIButton添加各种状态的背景颜色各背景图也要比UIView方便得多。

3)会议步骤:

  • 将自定义的Button添加到视频上
    //添加自定义的Button到视频镜头上
    self.button = [[ZYLButton alloc]
    initWithFrame:playerLayer.frame];
    self.button.touchDelegate = self;
    [playerView addSubview:self.button];

  • 在代理方法中改变定音量、亮度和速度
    首先定义个一枚举表示上下左右,这里只需要看清手指是左右如故左右滑动
    typedef NS_ENUM(NSUInteger, Direction) {
    DirectionLeftOrRight,
    DirectionUpOrDown,
    DirectionNone
    };
    再就是表明一个意味着方向的变量、一个记下用户触摸录像时的坐标变量、一个记录用户触摸视频时的亮度和音量大小的变量和一个笔录用户触摸屏幕是视频进度的变量
    @property (assign, nonatomic) Direction direction;
    @property (assign, nonatomic) CGPoint startPoint;
    @property (assign, nonatomic) CGFloat startVB;
    @property (assign, nonatomic) CGFloat startVideoRate;

  • 刚先导触摸视频的代理
    当用户第一次触摸视频时,记录第一次触摸的坐标、当前高低或者亮度、当前视频的进度,为了得到当前高低要首先定义MPVolumeView、
    UISlider
    @property (strong, nonatomic) MPVolumeView
    *volumeView;//控制音量的view

      @property (strong, nonatomic) UISlider* volumeViewSlider;//控制音量
    

4)会议前的预备:

      //设置self.volumeView的frame
      self.volumeView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.width * 9.0 / 16.0);

并且除了工作会议为期开设外,也迟早要讲求关爱成员的生存情形,这一点也是自个儿这一个年的变更。刚开始我觉着:工作就是工作,我和你扯屁的生存啊,我们都职业一点。

在getter方法中起初化:

切切实实会打脸,通过工作表现你的职业魅力是立竿见影的,不过每个人的特点、所处意况太迥异了,若是你不扩张问询维度及时支援我们疏通心情的话,很可能也会境遇和自我同一的情景:被陡然告诉想要离职。

  • (MPVolumeView *)volumeView {
    if (_volumeView == nil) {
    _volumeView = [[MPVolumeView alloc] init];
    [_volumeView sizeToFit];
    for (UIView view in [_volumeView subviews]){
    if ([view.class.description isEqualToString:@”MPVolumeSlider”]){
    self.volumeViewSlider = (UISlider
    )view;
    break;
    }
    }
    }
    return _volumeView;
    }

这种心态往往不是不难,假设可以及早发现,平时关联的话,可能会制止突发事态。当然她工作情形的改变相信您也可以感知到。

然后在先导触摸的代办里记录
#pragma mark – 起头触摸

3、和分子互换可以尝尝书面交流格局

    - (void)touchesBeganWithPoint:(CGPoint)point {
        //记录首次触摸坐标
        self.startPoint = point;
        //检测用户是触摸屏幕的左边还是右边,以此判断用户是要调节音量还是亮度,左边是亮度,右边是音量
        if (self.startPoint.x <= self.button.frame.size.width / 2.0) {
            //亮度
            self.startVB = [UIScreen mainScreen].brightness;
        } else {
            //音量
            self.startVB = self.volumeViewSlider.value;
        }
    }
    CMTime ctime = self.avPlayer.currentTime;
    self.startVideoRate = ctime.value / ctime.timescale / self.total;

俺们协会是毫无邮件的,全部都在日事清中总体开展任务,这就是说大家除了在干活总计中举办互换外,没有其他书面交流格局。

  • 随着在拖动的代办方法里改变音量、亮度和进度
    #pragma mark – 拖动

    • (void)touchesMoveWithPoint:(CGPoint)point {
      //得动手指在Button上移步的偏离
      CGPoint panPoint = CGPointMake(point.x – self.startPoint.x,
      point.y – self.startPoint.y);
      //分析出用户滑动的样子
      if (self.direction == DirectionNone) {
      if (panPoint.x >= 30 || panPoint.x <= -30) {
      //进度
      self.direction = DirectionLeftOrRight;
      } else if (panPoint.y >= 30 || panPoint.y <= -30) {
      //音量和亮度
      self.direction = DirectionUpOrDown;
      }
      }

          if (self.direction == DirectionNone) {
              return;
          } else if (self.direction == DirectionUpOrDown) {
              //音量和亮度
              if (self.startPoint.x <= self.button.frame.size.width / 2.0) {
          //调节亮度
                  if (panPoint.y < 0) {
                      //增加亮度
                      [[UIScreen mainScreen] setBrightness:self.startVB + (-panPoint.y / 30.0 / 10)];
                  } else {
                      //减少亮度
                      [[UIScreen mainScreen] setBrightness:self.startVB - (panPoint.y / 30.0 / 10)];
                  }
      
              } else {
                  //音量
                  if (panPoint.y < 0) {
                       //增大音量
                      [self.volumeViewSlider setValue:self.startVB + (-panPoint.y / 30.0 / 10) animated:YES];
                      if (self.startVB + (-panPoint.y / 30 / 10) - self.volumeViewSlider.value >= 0.1) {
                          [self.volumeViewSlider setValue:0.1 animated:NO];
                          [self.volumeViewSlider setValue:self.startVB + (-panPoint.y / 30.0 / 10) animated:YES];
                      }
      
                  } else {
                      //减少音量
                      [self.volumeViewSlider setValue:self.startVB - (panPoint.y / 30.0 / 10) animated:YES];
                  }
              }
          } else if (self.direction == DirectionLeftOrRight ) {
              //进度
              CGFloat rate = self.startVideoRate + (panPoint.x / 30.0 / 20.0);
              if (rate > 1) {
                  rate = 1;
              } else if (rate < 0) {
                  rate = 0;
              }
          }
      

      }

1)当我看出成员所做工作没有达到自己要求或者尚未跳过某项任务的妙方时,我就会指责(会说:你如此不对,你应该xx)。有时候成员会耍脾气,直接拒绝互换(这也能看出来大家公司充足扁平)。然后经常都是自个儿先认怂,通过日事清文档完整写出来自我的工作思路、你眼前所做格局的缺乏,尽量做到有理有据。

注意: 1、前面提到一个增大音量的bug,我这里的解决办法是如果检测到用户设置的音量比系统当前的音量大于0.1,表示此时设置的音量已经无效了,然后把音量设置为0.1后再设置为我们设置无效的那个音量就可以了,具体做法参考代码; 2、在修改视频播放进度的时候,最好不在移动的方法中实时修改视频播放进度,一方面会造成卡顿的现象,一方面没有必要这么做,所以这里只是记录了用户想要调整的进度,然后在触摸结束的方法中设置进度; 3、这改变音量会调用系统自己的UI显示音量大小,但是在设置亮度的时候是系统没有提供相应的UI,需要我们自己设置,这个小伙伴们按照项目的需求自行添加一个UI效果就好了。

下一场暴发了令我有所得的事情:他过来的时候也会详细给出他就此这样做的说辞、背景、无奈,然后转头告知自己本人所说的不成立以及我们在维系中冒出的题材。

  • 触摸截至的代办
    #pragma mark – 停止触摸

    • (void)touchesEndWithPoint:(CGPoint)point {
      if (self.direction == DirectionLeftOrRight) {
      [self.avPlayer seekToTime:CMTimeMakeWithSeconds(self.total *
      self.currentRate, 1) completionHandler:^(BOOL finished) {
      //在此地处理速度设置成功后的工作
      }];
      }
      }

这种方法一点都不浪费时间,相反可以扩张凝聚力、避免当面互换中不必要心思。

真机运行效果如图

2)可能依旧因为没有邮件交流的原由,为了避免信息衰减,当你在指点工作怎么样实施时,我也指出还要用书面表明一份。所未来来自家都是在成员的做事日志中详细评论然后讨论,然后由成员在总结中收拾。

Demo.png

本人所管团队较小,没有涉嫌到“制度”层面,以上都是表现艺术,那多少个总计都对应本人在近年倍受的实际上情况教育。

尾巴

到此处大家就做到了手指滑动视频控制音量、亮度和进度的需求,我们在友好的类型中其实使用时还需要依据项目需要加上适当的UI,处理其他部分逻辑和业务流程。希望我们经过这么些不大示例可以有协调的化解问题的思绪和流程,力争将一个即使很粗略的机能做到尽量完美。Demo可以在这里下载:示例<small>Demo</small>