视频随便找的
//大部分都是复制过来的源码。。

@interface JPDouyinProgressView: JPVideoPlayerProgressView

@end

@implementation JPDouyinProgressView

  • (void)layoutThatFits:(CGRect)constrainedRect
    nearestViewControllerInViewTree:(UIViewController *_Nullable)nearestViewController
    interfaceOrientation:(JPVideoPlayViewInterfaceOrientation)interfaceOrientation {
    [super layoutThatFits:constrainedRect
    nearestViewControllerInViewTree:nearestViewController
    interfaceOrientation:interfaceOrientation];

    self.trackProgressView.frame = CGRectMake(0,
    constrainedRect.size.height - JPVideoPlayerProgressViewElementHeight,
    constrainedRect.size.width,
    JPVideoPlayerProgressViewElementHeight);
    self.cachedProgressView.frame = self.trackProgressView.bounds;
    self.elapsedProgressView.frame = self.trackProgressView.frame;

}

@end
@implementation HFVideoListViewController

  • (void)viewDidLoad {
    [super viewDidLoad];

//禁止侧滑,防止不必要的bug。
id traget = self.navigationController.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:traget action:nil];
[self.view addGestureRecognizer:pan];

[self setup];

//视图全屏
self.scrollView.contentInset = UIEdgeInsetsZero;
if (@available(iOS 11.0, *)) {
self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}else{
self.automaticallyAdjustsScrollViewInsets = NO;
}

self.scrollViewOffsetYOnStartDrag = -1;
[self scrollViewDidEndScrolling];

}

  • (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.scrollView.contentInset = UIEdgeInsetsZero;
    if (@available(iOS 11.0, *)) {
    self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    }else{
    self.automaticallyAdjustsScrollViewInsets = NO;
    }

}

  • (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:animated];
    [IQKeyboardManager sharedManager].enable = NO;
    }

  • (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:animated];
    [IQKeyboardManager sharedManager].enable = YES;
    }

  • (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

}

  • (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    [self.secondImageView jp_stopPlay];
    }

#pragma mark - UIScrollViewDelegate

  • (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
    willDecelerate:(BOOL)decelerate {
    if (decelerate == NO) {
    [self scrollViewDidEndScrolling];
    }
    }

  • (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    [self scrollViewDidEndScrolling];
    }

  • (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@“❤️scrollviewY%f>>>startDrag%f”, self.scrollView.contentOffset.y,self.scrollViewOffsetYOnStartDrag);
    self.scrollViewOffsetYOnStartDrag = scrollView.contentOffset.y;
    }

#pragma mark - JPVideoPlayerDelegate

  • (BOOL)shouldShowBlackBackgroundBeforePlaybackStart {
    return YES;
    }

#pragma mark - Private

  • (void)scrollViewDidEndScrolling {

      NSLog(@"❤️❤️scrollviewY%f>>>startDrag%f", self.scrollView.contentOffset.y,self.scrollViewOffsetYOnStartDrag);
    

    if(self.scrollViewOffsetYOnStartDrag == self.scrollView.contentOffset.y){
    return;
    }
    //移除小视频上面展示的用户信息
    [self removeUserInfoViews];

    NSURL *url ;
    MKSmallVideoListModel *model;
    if (self.scrollViewOffsetYOnStartDrag == -1) {//只有刚进来的时候调用此方法,此currentindex是上级小视频列表传过来的下标。
    NSLog(@"-1>>>%ld",self.currentVideoIndex);
    model = self.ListArr[self.currentVideoIndex];
    // url = [NSURL URLWithString:model.video];
    url = sdAppendImage(model.video);

    }else{
    //判断上滑还是下滑
    if (self.scrollView.contentOffset.y==0) {
    if(self.currentVideoIndex == 0){

              self.currentVideoIndex = (self.ListArr.count - 1);}else{self.currentVideoIndex--;}if (self.currentVideoIndex < 0) {self.currentVideoIndex = 0;}model = self.ListArr[self.currentVideoIndex];url = sdAppendImage(model.video);
    

// url = [NSURL URLWithString:model.video];

    }else{if(self.currentVideoIndex == (self.ListArr.count - 1)){self.currentVideoIndex = 0;}else{self.currentVideoIndex++;}if (self.currentVideoIndex >= self.ListArr.count) {self.currentVideoIndex = self.ListArr.count - 1;}model = self.ListArr[self.currentVideoIndex];url = sdAppendImage(model.video);

// url = [NSURL URLWithString:model.video];
// url = [NSURL URLWithString:self.douyinVideoStrings[self.currentVideoIndex]];

    }
}CGSize referenceSize = UIScreen.mainScreen.bounds.size;
[self.scrollView setContentOffset:CGPointMake(0, referenceSize.height) animated:NO];[self.secondImageView jp_stopPlay];

//设置当前视频的顶层封面。。
_secondImageView1.hidden = NO;
_secondImageView1.alpha = 1;

[self.secondImageView jp_playVideoMuteWithURL:urlbufferingIndicator:nilprogressView:[JPDouyinProgressView new]configuration:^(UIView *view, JPVideoPlayerModel *playerModel) {view.jp_muted = NO;

// view.backgroundColor = [UIColor clearColor];
}];

self.secondImageView.jp_progressView.hidden = YES;// 添加小视频上面展示的用户信息并配置数据
[self setupUserInfoViews:model];
//配置视频封面
[self configVideoThumb];

}

  • (void)configVideoThumb{

    if (self.ListArr.count > _currentVideoIndex) {

      MKSmallVideoListModel *currentModel = self.ListArr[_currentVideoIndex];[self.secondImageView1 sd_setImageWithURL:sdAppendImage(currentModel.thumb) placeholderImage:nil];
    

    }

    NSInteger lastIndex = _currentVideoIndex-1;
    if (lastIndex < 0) {
    lastIndex = self.ListArr.count-1;
    }
    MKSmallVideoListModel *lastModel = self.ListArr[lastIndex];
    [self.firstImageView sd_setImageWithURL:sdAppendImage(lastModel.thumb) placeholderImage:nil];

    NSInteger nextIndex =_currentVideoIndex+1;
    if (nextIndex >= self.ListArr.count) {
    nextIndex = 0;
    }

    MKSmallVideoListModel *nextModel = self.ListArr[nextIndex];
    [self.thridImageView sd_setImageWithURL:sdAppendImage(nextModel.thumb) placeholderImage:nil];
    }

#pragma mark - Setup

  • (void)setup {
    self.view.backgroundColor = [UIColor whiteColor];
    CGSize referenceSize = UIScreen.mainScreen.bounds.size;
    // self.currentVideoIndex = 0;

    self.scrollView = ({
    UIScrollView *scrollView = [UIScrollView new];
    scrollView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:scrollView];
    scrollView.frame = self.view.bounds;
    scrollView.contentSize = CGSizeMake(referenceSize.width, referenceSize.height * 3);
    scrollView.pagingEnabled = YES;
    scrollView.delegate = self;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView;
    });

    self.firstImageView = ({
    UIImageView *imageView = [UIImageView new];
    [self.scrollView addSubview:imageView];
    imageView.frame = CGRectMake(0, 0, referenceSize.width, referenceSize.height);
    // imageView.image = [UIImage imageNamed:@“mine_redcoupon_redn”];
    imageView.userInteractionEnabled = YES;
    imageView;
    });

    self.secondImageView = ({
    UIImageView *imageView = [UIImageView new];
    [self.scrollView addSubview:imageView];
    imageView.frame = CGRectMake(0, referenceSize.height, referenceSize.width, referenceSize.height);
    // imageView.image = [UIImage imageNamed:@“placeholder2”];
    imageView.jp_videoPlayerDelegate = self;
    imageView.userInteractionEnabled = YES;
    imageView;
    });

    self.secondImageView1 = ({
    UIImageView *imageView = [UIImageView new];
    [self.scrollView addSubview:imageView];
    imageView.frame = CGRectMake(0, referenceSize.height, referenceSize.width, referenceSize.height);
    // imageView.image = [UIImage imageNamed:@“placeholder2”];
    imageView.userInteractionEnabled = YES;
    imageView;
    });

    self.thridImageView = ({
    UIImageView *imageView = [UIImageView new];
    [self.scrollView addSubview:imageView];
    imageView.frame = CGRectMake(0, referenceSize.height * 2, referenceSize.width, referenceSize.height);
    // imageView.image = [UIImage imageNamed:@“mine_redcoupon_redd”];
    imageView.userInteractionEnabled = YES;
    imageView;
    });

    self.backBtn = ({
    UIButton *btn = [UIButton buttonWithType:(UIButtonTypeCustom)];
    [btn setImage:[UIImage imageNamed:@“navi_back_white”] forState:(UIControlStateNormal)];
    [btn setFrame:CGRectMake(10, IPHONE_X?44:20, 44, 44)];
    [btn addTarget:self action:@selector(backBtnClick) forControlEvents:(UIControlEventTouchUpInside)];
    [self.view addSubview:btn];
    btn;
    });

}
#pragma mark --↓-- Videodelegate --↓–

  • (void)playerStatusDidChanged:(JPVideoPlayerStatus)playerStatus {
    //解决视频加载后有一个黑色闪动的问题,视频大的话,还是有这种问题,目前没有好的解决方法。
    if (playerStatus == JPVideoPlayerStatusPlaying) {

      [UIView animateWithDuration:0.15 animations:^{self.secondImageView1.alpha = 0;}completion:^(BOOL finished) {self.secondImageView1.hidden = YES;}];
    

    }
    }

  • (void)setupUserInfoViews:(MKSmallVideoListModel *)model {
    _tempModel = model;

    [self.secondImageView addSubview:self.iconImgView];
    }

基于JPVideoPlayerKit的小视频播放相关推荐

  1. 基于FFmpeg4.1的视频播放器的极简实现(音视频学习笔记四)

    前言 这篇文章记录一个简单视频播放器的开发过程,代码极其为简洁,基于ffmpeg最新版本4.1实现的.视频渲染用的SDL2.0,SDL视频渲染部分代码直接copy的雷神的最简单的基于FFMPEG+SD ...

  2. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  3. 《基于 FFmpeg + SDL 的视频播放器的制作》课程的视频

    这两天开始带广播电视工程大二的暑假小学期的课程设计了.本次小学期课程内容为<基于 FFmpeg + SDL 的视频播放器的制作>,其中主要讲述了视音频开发的入门知识.由于感觉本课程的内容不 ...

  4. 基于 FFmpeg SDL 的视频播放器的制作 课程的视频

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这两天开 ...

  5. bmob php支付,基于Bmob在小程序端实现一键支付

    基于Bmob在小程序端实现一键支付教程: 几个容易忽略的细节 1.需要先拿到openid var openId = Bmob.User.current().get('authData').weapp. ...

  6. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  7. [js] 微信小程序实现轨迹回放,微信原生小程序,基于uniapp的小程序?

    [js] 微信小程序实现轨迹回放,微信原生小程序,基于uniapp的小程序? 需要写出轨迹拖动,进度条,开始,暂停,结束功能. 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一 ...

  8. matlab 程序 收缩,基于MATLAB的小波收缩去噪方法研究(程序)

    基于MATLAB的小波收缩去噪方法研究(程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文15400字,程序,答辩PPT) 摘 要 信号在采集.传输和获取的过程中难免会受到各种噪声的干扰 ...

  9. python实现蒙特卡洛算法_用Python实现基于蒙特卡洛算法小实验

    用Python实现基于蒙特卡洛算法小实验 蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯· 诺伊曼 ,他在20世纪40年代中期用驰名世界的赌城- ...

最新文章

  1. AI安全最全“排雷图”来了!腾讯发布业内首个AI安全攻击矩阵
  2. 百度2019年财报喜忧参半,决胜AI时代仍不好说
  3. PHP扩展开发入门3------带参数的函数
  4. python 选择题 多线程_python多线程一些知识点梳理
  5. intellij idea使用的准备工作
  6. php 查看spl,PHP使用标准库spl实现的观察者模式示例
  7. js 数据写到本地记事本_微信小程序连接Mysql数据库步骤
  8. 基于CentOS7.2安装Kubernetes-v1.2
  9. NVMe驱动学习记录-1
  10. 您的计算机存在远程桌面连接,远程桌面无法连接,详细教您电脑远程桌面无法连接怎么办...
  11. 八种常见的防盗链方法总结及分析 (转自http://www.cnblogs.com/uubox)
  12. 解决Maven报错:Could not transfer artifact xxx
  13. 转载:日本动漫发展史(新浪网)
  14. “Your Firefox profile cannot be loaded. It may be missing or inaccessible.“
  15. windows中git输错密码后不能重新输入的问题
  16. 用VC++6.0制作简易浏览器(转)
  17. 益聚星荣:不打老婆的即时到账”?还呗贷款平台广告词惹争议
  18. 华为新版Datacom认证介绍
  19. Uva207 PGA Tour Prize Money
  20. 突破硬件瓶颈(二):存储架构和协议瓶颈

热门文章

  1. 云音乐vue开发日记
  2. 英语中的逻辑思维真奇妙
  3. 用QT做串口通讯,读取身份证信息
  4. 某美颜app sig参数分析
  5. python3文件的编码类型是_Python3.x环境创建Python脚本文件时,需要将文件编码格式设置为...
  6. n*n蛇形方阵的输出
  7. 别让职场形象毁了你的职场前程
  8. 【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解
  9. 实测:华为鸿蒙系统比 Android 系统快 60%!
  10. 由递推关系式用差分方程的方法得到通项公式实现求斐波那契数列的第n项;迭代、递归、栈、差分方程之间的本质联系以及由推广的迭代法解决“变态青蛙跳台阶”问题;汉诺塔问题的数字特征以及用递归解决的原理推导。