CTVideoPlayerView 1.4.5

CTVideoPlayerView 1.4.5

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2017年12月

Casa Taloyum维护。



 
依赖
AFNetworking>= 0
CTPersistance>= 0
HandyFrame>= 0
 

  • 作者
  • Casa Taloyum

CTVideoPlayerView

Join the chat at https://gitter.im/casatwy/CTVideoPlayerView

在git克隆仓库后,运行pod update然后打开CTVideoPlayerView.xcworkspace来尝试演示。

功能

  • 它是UIView的一个子类
  • 可以播放本地媒体或通过HTTP流式传输远程媒体
  • 可定制的UI和用户交互
  • 无大小限制
  • 支持方向变化
  • 简单的API
  • 播放时间观察,视频时长
  • 下载与本地文件管理
  • 支持在下载视频时更改封面视图,只需创建一个UIView<CTVideoPlayerDownloadingViewProtocol>并将其分配给CTVideoView.downloadingView即可。详情请参考DownloadThenPlayViewController
  • 支持全屏切换和退出全屏
  • 支持水平滑动以向前或向后移动播放秒数,垂直滑动以改变音量

待办事项

  • 缓存从远程URL获取的已播放视频
  • 播放YouTube
  • 播放RTSP / RTMP

CocoaPods

pod "CTVideoPlayerView"

快速尝试

1. 导入头文件

import <CTVideoPlayerView/CTVideoViewCommonHeader.h>

2. 播放

2.1 使用媒体播放

CTVideoView *videoView = [[CTVideoView alloc] init];
videoView.assetToPlay = [AVURLAsset assetWithURL:assetUrl];
[videoView play];

CTVideoView可以直接播放任何AVAsset,但videoUrlTypeactualVideoUrlType将设置为CTVideoViewVideoUrlTypeAsset

如果您关心所播放内容的URL类型,请参考下方的“使用URL播放”。

2.2 使用URL播放

videoUrl设置为使CTVideoView使用URL播放,videoUrlTypeactualVideoUrlType将被适当地赋值。如果您不关心这些,请直接使用上述“使用媒体播放”。

简而言之

CTVideoView *videoView = [[CTVideoView alloc] init];
videoView.frame = CGRectMake(0,0,100,100);
[self.view addSubview:videoView];

videoView.videoUrl = [NSURL URLWithString:@"http://7xs8ft.com2.z0.glb.qiniucdn.com/rcd_vid_865e1fff817746d29ecc4996f93b7f74"]; // mp4 playable
[videoView play];

长篇大论

@interface SingleVideoViewController ()

@property (nonatomic, strong) CTVideoView *videoView;

@end

@implementation SingleVideoViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addSubview:self.videoView];

	// self.videoView.videoUrl = [NSURL URLWithString:@"http://7xs8ft.com2.z0.glb.qiniucdn.com/rcd_vid_865e1fff817746d29ecc4996f93b7f74"]; // mp4 playable
	// self.videoView.videoUrl = [NSURL URLWithString:@"https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8"]; // m3u8 playable
	self.videoView.videoUrl = [[NSBundle mainBundle] URLForResource:@"a" withExtension:@"mp4"]; // native url playable
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
 	self.videoView.frame = self.view.bounds;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
	[self.videoView play];
}

- (CTVideoView *)videoView
{
    if (_videoView == nil) {
        _videoView = [[CTVideoView alloc] init];
	}
    return _videoView;
}

@end

更多示例

下载视频

将下载策略设置为CTVideoViewDownloadStrategyDownloadOnlyForegroundCTVideoViewDownloadStrategyDownloadForegroundAndBackground以启用下载

[CTVideoManager sharedInstance].downloadStrategy = CTVideoViewDownloadStrategyDownloadForegroundAndBackground;

// they works the same
[videoView startDownloadTask];
// [[CTVideoManager sharedInstance] startDownloadTaskWithUrl:url];
// [[CTVideoManager sharedInstance] startAllDownloadTask];

如果下载策略是CTVideoViewDownloadStrategyNoDownload,则即使进行下载调用,也不会生成下载任务。

[CTVideoManager sharedInstance].downloadStrategy = CTVideoViewDownloadStrategyNoDownload;

[videoView startDownloadTask]; // won't start download task
[[CTVideoManager sharedInstance] startDownloadTaskWithUrl:url]; // won't start download task
[[CTVideoManager sharedInstance] startAllDownloadTask]; // won't start download task

视频下载后,CTVideoPlayerView将记住本地文件所在位置以及哪个远程URL与之对应。您可以调用refreshUrl来刷新当前视频视图的URL,然后播放本地视频文件。如果您创建一个全新的视频播放器视图,并将videoUrl设置为远程URL,视频播放器视图将自动搜索本地文件并替换。

下载事件

您可以设置 downloadDelegate 到视频播放器视图以获得更精确的控制。

@protocol CTVideoViewDownloadDelegate <NSObject>

@optional
- (void)videoViewWillStartDownload:(CTVideoView *)videoView;
- (void)videoView:(CTVideoView *)videoView downloadProgress:(CGFloat)progress;
- (void)videoViewDidFinishDownload:(CTVideoView *)videoView;
- (void)videoViewDidFailDownload:(CTVideoView *)videoView;
- (void)videoViewDidPausedDownload:(CTVideoView *)videoView;
- (void)videoViewDidDeletedDownloadTask:(CTVideoView *)videoView;
- (void)videoViewIsWaitingForDownload:(CTVideoView *)videoView;

@end

如果您没有视频播放器视图实例,您可以通过在 CTVideoViewDefinitions.h 中观察通知来获取下载事件的警报。

/**
 *  notifications
 */
extern NSString * const kCTVideoManagerWillDownloadVideoNotification;
extern NSString * const kCTVideoManagerDidFinishDownloadVideoNotification;
extern NSString * const kCTVideoManagerDownloadVideoProgressNotification;
extern NSString * const kCTVideoManagerDidFailedDownloadVideoNotification;
extern NSString * const kCTVideoManagerDidPausedDownloadVideoNotification;
extern NSString * const kCTVideoManagerDidDeletedDownloadVideoNotification;

/**
 *  notification userinfo keys
 */
extern NSString * const kCTVideoManagerNotificationUserInfoKeyRemoteUrlList;
extern NSString * const kCTVideoManagerNotificationUserInfoKeyRemoteUrl;
extern NSString * const kCTVideoManagerNotificationUserInfoKeyNativeUrl;
extern NSString * const kCTVideoManagerNotificationUserInfoKeyProgress;

管理本地视频文件

只需使用 CTVideoDataCenter

@interface CTVideoDataCenter : NSObject

// create
- (void)insertRecordWithRemoteUrl:(NSURL *)remoteUrl status:(CTVideoRecordStatus)status;

// read
- (NSURL *)nativeUrlWithRemoteUrl:(NSURL *)remoteUrl;
- (NSArray <id<CTPersistanceRecordProtocol>> *)recordListWithStatus:(CTVideoRecordStatus)status;
- (CTVideoRecordStatus)statusOfRemoteUrl:(NSURL *)remoteUrl;
- (id<CTPersistanceRecordProtocol>)recordOfRemoteUrl:(NSURL *)url;

// update
- (void)updateWithRemoteUrl:(NSURL *)remoteUrl nativeUrl:(NSURL *)nativeUrl;
- (void)updateWithRemoteUrl:(NSURL *)remoteUrl nativeUrl:(NSURL *)nativeUrl status:(CTVideoRecordStatus)status;

- (void)updateStatus:(CTVideoRecordStatus)status toRemoteUrl:(NSURL *)remoteUrl;
- (void)updateStatus:(CTVideoRecordStatus)status progress:(CGFloat)progress toRemoteUrl:(NSURL *)remoteUrl;
- (void)updateAllStatus:(CTVideoRecordStatus)status;

- (void)pauseAllRecordWithCompletion:(void(^)(void))completion;
- (void)pauseRecordWithRemoteUrlList:(NSArray *)remoteUrlList completion:(void(^)(void))completion;

- (void)startDownloadAllRecordWithCompletion:(void(^)(void))completion;
- (void)startDownloadRemoteUrlList:(NSArray *)remoteUrlList completion:(void(^)(void))completion;

// delete
- (void)deleteWithRemoteUrl:(NSURL *)remoteUrl;
- (void)deleteAllRecordWithCompletion:(void(^)(NSArray *deletedList))completion;
- (void)deleteAllNotFinishedVideo;

@end

您可能希望在这个数据中心有更多方法,您可以发起一个issue告诉我您需要什么方法,或者直接给我发送pull request。

观察时间

1. 将 shouldObservePlayTime 设置为 YES,并设置 timeGapToObserve。

如果 timeGapToObserve 是 1,表示 1/100 秒。

[videoView setShouldObservePlayTime:YES withTimeGapToObserve:10.0f]; // calls the delegate method `- (void)videoView:didPlayToSecond:` every 0.1s during playing.

2. 设置 timeDelegate

videoView.timeDelegate = self;

3. 在 timeDelegate 中实现 - (void)videoView:didPlayToSecond:

- (void)videoView:(CTVideoView *)videoView didPlayToSecond:(CGFloat)second
{
	NSLog(@"%f", second);
}

定制操作按钮

1. 设置自定义按钮

videoView.playButton = customizedPlayButton;
videoView.retryButton = customizedRetryButton;

2. 设置 id<CTVideoViewButtonDelegate> 并实现方法来自定义按钮布局

如果您不做这个,按钮将按照 CGSizeMake(100, 60) 的大小进行布局,并放置在视频中央。

使用 pod "HandyFrame" 将使您的布局代码更简单、更整洁。

#import <HandyFrame/UIView+LayoutMethods.h>

设置按钮代理

videoView.buttonDelegate = self;

使用 HandyFrame 进行布局

- (void)videoView:(CTVideoView *)videoView layoutPlayButton:(UIButton *)playButton
{
    playButton.size = CGSizeMake(100, 60);
	[playButton rightInContainer:5 shouldResize:NO];
   	[playButton bottomInContainer:5 shouldResize:NO];
}

- (void)videoView:(CTVideoView *)videoView layoutRetryButton:(UIButton *)retryButton
{
    retryButton.size = CGSizeMake(100, 60);
	[retryButton rightInContainer:5 shouldResize:NO];
   	[retryButton bottomInContainer:5 shouldResize:NO];
}

全屏播放和退出全屏

    if (self.videoView.isFullScreen) {
        [self.videoView exitFullScreen];
    } else {
        [self.videoView enterFullScreen];
    }

查看演示 ChangeToFullScreenViewController

滑动以前进或后退

此功能默认启用,如果您不想使用它,只需将 isSlideFastForwardDisabled 设置为 YES

videoView.isSlideFastForwardDisabled = YES;

要显示移动指示器,您应该设置 playControlDelegate,并使用以下方法

@protocol CTVideoViewPlayControlDelegate <NSObject>

@optional

- (void)videoViewShowPlayControlIndicator:(CTVideoView *)videoView;
- (void)videoViewHidePlayControlIndicator:(CTVideoView *)videoView;
- (void)videoView:(CTVideoView *)videoView playControlDidMoveToSecond:(CGFloat)second direction:(CTVideoViewPlayControlDirection)direction;

@end

代理方法 - (void)videoViewShowPlayControlIndicator:(CTVideoView *)videoView; 告诉您,您可以显示自己的自定义指示器视图。

代理方法 - (void)videoViewHidePlayControlIndicator:(CTVideoView *)videoView; 告诉您,您可以隐藏自己的自定义指示器视图。

代理方法 - (void)videoView:(CTVideoView *)videoView playControlDidMoveToSecond:(CGFloat)second direction:(CTVideoViewPlayControlDirection)direction; 告诉您可以使用什么数据来更新您自己的自定义指示器视图的内容。

手动

属性

常规

isMuted

设置视频为静音

shouldPlayAfterPrepareFinished

如果您希望在视频准备后就立即播放视频,请将此设置为 YES。

如果调用 play 而不是 prepare,即使将此属性设置为 NO,视频在准备完成后也将播放。

shouldReplayWhenFinish

设置为 YES 将在视频到达结束时重新播放视频。

shouldChangeOrientationToFitVideo

设置为 YES 将会自动更改视频视图的朝向以适应视频播放。

下载

shouldDownloadWhenNotWifi

这是一个只读属性,如果您想更改此值,请将 NSUserDefaults 中的 kCTVideoViewShouldDownloadWhenNotWifi 的布尔值设置为更改此值,默认是 NO。

操作按钮

shouldShowOperationButton

设置为 YES 以指示视频视图应该显示操作按钮

playButton

自定义播放按钮的视图

retryButton

重试按钮的视图

时间

totalDurationSeconds

显示视频长度(秒)

shouldObservePlayTime

如果您想触发 id<CTVideoViewTimeDelegate>- (void)videoView:didPlayToSecond:,您应该将此属性设置为 YES。

currentPlaySpeed

设置为 2.0 表示 2x 的速度。

视频封面视图

shouldShowOperationButton

设置为 YES 以指示视频视图应该显示视频封面视图

coverView

自定义封面视图