CNVideoVC.m
8.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
//
// CNVideoVC.m
// BBASMDemo_Example
//
// Created by CNLive on 2021/10/30.
// Copyright © 2021 杨苓玉. All rights reserved.
//
#import "CNVideoVC.h"
#import "ZFPlayerControlView.h"
#import "ZFAVPlayerManager.h"
#import "CNVideoModel.h"
#import <MJExtension/NSObject+MJKeyValue.h>
#import <BBAMNP/BBASMVideoHandleDelegate.h>
@interface CNVideoVC ()
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) ZFPlayerControlView *controlView;
@property (nonatomic, strong) UIButton *playBtn;
@property (nonatomic, strong) CNVideoModel *playerModel;
@end
@implementation CNVideoVC
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor blackColor];
[self.view addSubview:self.containerView];
ZFAVPlayerManager *playerManager = [[ZFAVPlayerManager alloc] init];
self.videoPlayer = [ZFPlayerController playerWithPlayerManager:playerManager containerView:self.containerView];
self.videoPlayer.controlView = self.controlView;
self.videoPlayer.shouldAutoPlay = NO;
[self setDelegateEvent];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.videoPlayer.viewControllerDisappear = NO;
}
// 设置播放器回调事件
- (void)setDelegateEvent {
__weak typeof(self) weakSelf = self;
// 播放器转屏的回调
self.videoPlayer.playerScreenModeChanged = ^(BOOL isFullScreen, BOOL isFullScreenBtnClick) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (isFullScreen) {
[strongSelf.delegate playerCustomSwitchToFullScreenMode:YES videoId:nil isCustomEnterExitFullScreen:NO];
} else {
[strongSelf.delegate playerExitCustomFullScreenMode:YES videoId:nil isCustomEnterExitFullScreen:NO];
}
};
// 播放器开始缓冲
self.videoPlayer.playerBufferTimeChanged = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSTimeInterval bufferTime) {
__strong typeof(weakSelf)strongSelf = weakSelf;
if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(playerBufferEmpty:)]) {
[strongSelf.delegate playerBufferEmpty:strongSelf.playerModel.vid];
}
};
// 播放器开始播放
self.videoPlayer.playerReadyToPlay = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSURL * _Nonnull assetURL) {
__strong typeof(weakSelf)strongSelf = weakSelf;
if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(playerDidPlay:)]) {
[strongSelf.delegate playerDidPlay:strongSelf.playerModel.vid];
}
};
self.videoPlayer.playerPlayStateChanged = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, ZFPlayerPlaybackState playState) {
__strong typeof(weakSelf)strongSelf = weakSelf;
// 播放暂停
if (playState == ZFPlayerPlayStatePaused) {
if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(playerDidPause:)]) {
[strongSelf.delegate playerDidPause:strongSelf.playerModel.vid];
}
}
};
// 播放完成
self.videoPlayer.playerDidToEnd = ^(id _Nonnull asset) {
__strong typeof(weakSelf)strongSelf = weakSelf;
if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(playerDidEnd:)]) {
[strongSelf.delegate playerDidEnd:strongSelf.playerModel.vid];
}
};
// 播放进度
self.videoPlayer.playerPlayTimeChanged = ^(id<ZFPlayerMediaPlayback> _Nonnull asset, NSTimeInterval currentTime, NSTimeInterval duration) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf.delegate &&
[strongSelf.delegate respondsToSelector:@selector(videoPlayerUpdateTimeProgress:duration:videoId:)]) {
[strongSelf.delegate videoPlayerUpdateTimeProgress:currentTime
duration:duration
videoId:strongSelf.playerModel.vid];
}
};
}
- (void)viewWillLayoutSubviews {
CGFloat x = 0;
CGFloat y = 0;
CGFloat w = CGRectGetWidth(self.view.frame);
CGFloat h = CGRectGetHeight(self.view.frame);
self.containerView.frame = CGRectMake(x, y, w, h);
w = 44;
h = w;
x = (CGRectGetWidth(self.containerView.frame)-w)/2;
y = (CGRectGetHeight(self.containerView.frame)-h)/2;
self.playBtn.frame = CGRectMake(x, y, w, h);
}
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.videoPlayer.isFullScreen) {
return UIStatusBarStyleLightContent;
}
return UIStatusBarStyleDefault;
}
- (BOOL)prefersStatusBarHidden {
return NO;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationSlide;
}
- (BOOL)shouldAutorotate {
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if (self.videoPlayer.isFullScreen) {
return UIInterfaceOrientationMaskLandscape;
}
return UIInterfaceOrientationMaskPortrait;
}
#pragma mark - Getting
- (ZFPlayerControlView *)controlView {
if (!_controlView) {
_controlView = [ZFPlayerControlView new];
_controlView.fastViewAnimated = YES;
_controlView.autoHiddenTimeInterval = 5;
_controlView.autoFadeTimeInterval = 0.5;
_controlView.prepareShowLoading = YES;
_controlView.prepareShowControlView = YES;
}
return _controlView;
}
- (UIView *)containerView {
if (!_containerView) {
_containerView = [UIView new];
}
return _containerView;
}
- (UIButton *)playBtn {
if (!_playBtn) {
_playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *path = [bundle URLForResource:@"ZFPlayer" withExtension:@"bundle"];
NSBundle *imageBundle = [NSBundle bundleWithURL:path];
[_playBtn setImage:[UIImage imageNamed:@"new_allPlay_44x44_" inBundle:imageBundle withConfiguration:nil] forState:UIControlStateNormal];
[_playBtn addTarget:self action:@selector(playClick:) forControlEvents:UIControlEventTouchUpInside];
}
return _playBtn;
}
- (void)playClick:(UIButton *)sender {
[self.videoPlayer playTheIndex:0];
}
- (void)loadVideoInfo:(NSDictionary *)info {
if (!_playerModel) {
_playerModel = [[CNVideoModel alloc] initWithDictionary:info];
}
// 设置播放url
NSString *urlStr = _playerModel.videoUrl;
self.videoPlayer.assetURL = [NSURL URLWithString:urlStr];
[self setUpVideo:_playerModel];
}
- (void)updateVideoInfo:(NSDictionary *)info {
[_playerModel updateWithDictionary:info];
[self setUpVideo:_playerModel];
}
- (void)setUpVideo:(CNVideoModel *)playerModel {
if (playerModel) {
// 设置播放器是否静音
[self.videoPlayer.currentPlayerManager setMuted:_playerModel.muted];
// 设置是否循环播放
[self.videoPlayer setLoop: _playerModel.loop];
// 首次播放跳转到指定initialTime
if (_playerModel.initialTime > 0) {
[self.videoPlayer seekToTime:_playerModel.initialTime completionHandler:nil];
}
// videoGravity 0:fill(拉伸填满),1:contain(等比缩放),2:cover(裁切填满),默认是1
[self.videoPlayer setVideoGravity:_playerModel.videoGravity];
// 显示控制视图
self.videoPlayer.controlView.hidden = _playerModel.showControls? NO : YES;
// 在非全屏模式下,是否开启亮度与音量调节手势;默认是NO不开启
self.videoPlayer.brightnessVolumeGestureEnabled = _playerModel.brightnessVolumeGestureEnabled;
self.controlView.showFullscreenBtn = _playerModel.showFullscreenBtn;
self.controlView.showRateBtn = _playerModel.showRateBtn;
self.controlView.showProgress = _playerModel.showProgress;
// 默认显示左下角播放按钮,隐藏视频中间按钮
self.controlView.showCenterPlayBtn = _playerModel.showPlayBtn ? !_playerModel.showPlayBtn : _playerModel.showCenterPlayBtn;
self.controlView.showPlayBtn = _playerModel.showPlayBtn;
self.controlView.showMuteBtn = _playerModel.showMuteBtn;
self.controlView.enableProgressGesture = _playerModel.enableProgressGesture;
self.controlView.enablePlayGesture = _playerModel.enablePlayGesture;
self.controlView.showVslideBtnInFullscreen = _playerModel.showVslideBtnInFullscreen;
[self.controlView.portraitControlView showTitle:_playerModel.title];
}
}
- (void)hiddenViewsForLive {
self.controlView.showProgress = NO;
}
- (void)setPlayerBufferTime:(NSTimeInterval)cache {
[_videoPlayer.controlView videoPlayer:_videoPlayer bufferTime:cache];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end