GitHub 仓库地址

一个高度封装的视频播放器视图,基于 AVPlayer、AVPlayerLayer、AVPlayerItem。

继承自 UIView,可以当做一般视图使用,适用于 Swift 和 Objective-C。

Example

Installation

Requirements

  • Xcode 8 or higher
  • iOS 11.0 or higher
  • ARC

Cocoapods

pod 'BBPlayerView'

Manually

  1. 下载 BBPlayerView。
  2. 添加 "BBPlayerView/Resource" 文件夹到项目中。

API

  • Delegate
@class BBPlayerView;
@protocol BBPlayerViewDelegate <NSObject>
@optional /**
播放进度更新回调
当播放结束后可以决定是否循环播放
*/
- (void)bb_playerView:(nullable BBPlayerView *)playerView progressDidUpdatedAtTime:(CGFloat)currentTime totalTime:(CGFloat)totalTime progress:(CGFloat)progress; /** 播放状态变化回调 */
- (void)bb_playerView:(nullable BBPlayerView *)playerView statusDidUpdated:(BBPlayerViewStatus)status; /** 预加载进度回调 */
- (void)bb_playerView:(nullable BBPlayerView *)playerView didPreloadData:(CGFloat)startTime durationTime:(CGFloat)durationTime totalLoadedTime:(CGFloat)totalLoadedTime totalTime:(CGFloat)totalTime; @end
  • Class
@interface BBPlayerView : UIView

/**
代理
通过代理方法可以获取播放状态、播放进度、预加载进度的变化
!!!确保在调用 -bb_loadDataWithURL: 方法之前设置代理属性(如果不需要代理则不用设置)!!!
*/
@property (nonatomic, weak, nullable) IBOutlet id <BBPlayerViewDelegate> bb_delegate; /**
加载媒体资源或切换媒体资源
如果新加载的媒体资源 URL 和当前载入的 ULR 相同且播放器处于 BBPlayerViewStatusReadyToPlay 状态,则忽略本次加载操作
每次真正载入媒体资源时,都会自动调用一次 -bb_release 方法
*/
- (void)bb_loadDataWithURL:(nullable NSString *)url;
/** 清空播放器 */
- (void)bb_release; /**
播放
由于 AVPlayer 的属性 actionAtItemEnd 设置为 AVPlayerActionAtItemEndPause (默认值)
所以在媒体资源播放结束后 AVPlayer 的 rate 会设为 0.0
在媒体资源结尾处调用该方法无效(进度不变仍处在 1.0) 注意:在加载某些媒体资源时,播放结束后调用 -bb_play/-bb_pause 方法可能会改变 AVPlayer 的 rate 值为 1.0/0.0
那么再去调用 -bb_seekToProgress:completionHandler: 方法,可能在跳转成功后处于 播放/暂停 状态
所以确保媒体资源播放结束后不要调用 -bb_play/-bb_pause 方法
*/
- (void)bb_play;
/** 暂停 */
- (void)bb_pause; /// 跳转至指定进度。
/// 该方法完成后不会改变播放速率
/// 该方法是异步操作
/// @param progress 指定进度。取值范围:0.0 ~ 1.0
/// @param completionHandler 结束回调。finished 参数:YES 表示跳转完成;NO 表示跳转失败或取消了
- (void)bb_seekToProgress:(CGFloat)progress completionHandler:(void (^ _Nullable)(BOOL finished))completionHandler; /**
视频填充模式
BBPlayerViewGravityScaleFill -- 填充满视图,可能变形,内容不会缺失
BBPlayerViewGravityAspectFill -- 填充满视图,不变形,可能内容缺失
BBPlayerViewGravityAspectFit -- 不变形填充视图,直到一个边到达视图边界,内容不会缺失
*/
@property(nonatomic) BBPlayerViewGravity bb_videoGravity; @end
@interface BBPlayerViewCellManager : NSObject

@property (class, readonly) BBPlayerViewCellManager *bb_manager;

/**
添加真实播放视频的 cell
只在 cell 播放视频时把该 cell 加入到 manager 来管理
*/
- (void)addCell:(id<BBPlayerViewCellManagerDelegate>)cell; /**
移除 cell
在 cell 进入可复用状态调用
即:在 -prepareForReuse 调用该方法
*/
- (void)removeCell:(id<BBPlayerViewCellManagerDelegate>)cell; /**
移除全部 cell
在列表所在控制器销毁时调用
即:在 -dealloc 调用该方法
*/
- (void)removeAllCells; /**
所有 cell 暂停播放
指定某个 cell 播放时,其他所有 cell 暂停播放
*/
- (void)pauseAllCellPlayers; @end

Use

导入文件

  • Swift 中在需要引用的地方
import BBPlayerView
  • Objective-C 中在需要引用的地方
#import "BBPlayerView.h"

使用说明

BBPlayerView 可以像 UIView 一样代码创建或者在 xib、storyboard 拖拽创建。

详细使用方法请下载项目参考使用示例,包括简单的视频播放和视频列表播放功能。

  1. 如果不关心资源加载状态只需两行代码即可实现。
[_playerView bb_loadDataWithURL:_URLField.text];
[_playerView bb_play];
  1. 通过 BBPlayerView 提供的公开方法可以很容易实现:加载播放资源、播放、暂停、重新播放、跳转指定进度、释放资源清空播放器。
  2. 视频列表一般会保证只有一个视频在播放,所以要控制 cell 中的播放器在其他 cell 播放时暂停播放。

    BBPlayerViewCellManager 就是一个管理视频列表 cell 的管理类。

播放状态转移图片

图片中箭头表示操作或持续操作的结果,矩形表示状态。



GitHub 仓库地址

BBPlayerView的更多相关文章

随机推荐

  1. 38、tftp搭建

    38.1.什么是tftp: TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文 件传输的协议,提供 ...

  2. 11、gitlab和Jenkins整合(1)

    1.在jenkins上安装git: 因为jenkins需要在gitlab上拉取代码: 具体的git安装,参考"4.git和gitlab的配置--4.2.git编译安装:": 2.在 ...

  3. Java+Selenium 上传文件,点击选择“浏览文件”按钮,报错invalid argument

    Java+Selenium 上传文件,点击选择"浏览文件"按钮,报错invalid argument 解决代码: Actions action=new Actions(driver ...

  4. 简单学习java内存马

    看了雷石的内存马深入浅出,就心血来潮看了看,由于本人java贼菜就不介绍原理了,本文有关知识都贴链接吧 前置知识 本次主要看的是tomcat的内存马,所以前置知识有下列 1.tomcat结构,tomc ...

  5. Java | 标识符 & 关键字

    标识符是什么? 标识符 标识符是指在程序中,我们自己定义的内容.比如类的名字.方法的名字和变量的名字等等,都是标识符.在我们写的第一个程序当中,我们给类起名叫做Hello 也叫做标识符. 命名规则 标 ...

  6. 重新梳理调度器——GMP 调度模型

    调度器--GMP 调度模型 Goroutine 调度器,它是负责在工作线程上分发准备运行的 goroutines. 首先在讲 GMP 调度模型之前,我们先了解为什么会有这个模型,之前的调度模型是什么样 ...

  7. WSL2:Windows 亲生的 Linux 子系统

    作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...

  8. Day3 变量 运算符 及运算符的优先级

    变量 什么是变量: 可以变化的量 Java 是一种强类型语言,每个变量都必须声明其类型. Java变量是程序中最基本的存储单位,其要素包括变量名,变量类型,作用域. 注意事项: 每个变量都有类型, 类 ...

  9. Gradle入门第一集【下载,安装和测试】

    参考:https://www.cnblogs.com/panchanggui/p/9394760.html 1,http://services.gradle.org/distributions/链接下 ...

  10. 8Java设计模式(持续更新)

    1.单例模式(Singleton pattern): 单例模式的实现方式是,一个类能返回对象的一个引用(永远是同一个)和一个获得该唯一实例的方法(必须是静态方法). 饿汉式: public class ...