CNVideoVC.m 8.91 KB
//
//  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