CNLivePlayerViewController.swift 6.36 KB
//
//  CNLivePlayerViewController.swift
//  metaCode
//
//  Created by zx on 2023/11/24.
//

import Foundation

typealias popActionCallBackBlock = (_ time: Double,_ isPause:Bool,_ isPlayEnd:Bool) -> Void

class CNLivePlayerViewController:CNLiveBaseViewController{
    
    // MARK: - 播放设置
    /**
     初始化视频链接地址 为空为停止播放
     */
    var playUrl:URL?
    /**
     视频链接是否为直播
     */
    var isLive:Bool = false

    /// 初始化视频
    /// @param playUrl 视频链接地址 为空为停止播放
    /// @param playTime 播放时间
    func setPlayUrl(playUrl:URL,playTime:Double){
        self.playUrl = playUrl
        self.isLive = false
        if self.playUrl?.scheme == "file"{
            self.isLocalUrl = true
        }else{
            self.isLocalUrl = false
        }
        self.playerView?.setPlayUrl(playUrl: self.playUrl!, isLive: self.isLive)
        self.playerView?.startPlayTime = playTime
    }
    // MARK: - 封面图
    /**
     封面图(不传封面图就不显示)
     */
    var _coverImage:UIImage?
    var coverImage:UIImage?{
        get{
            _coverImage
        }
        set{
            _coverImage = newValue
            self.playerView?.controlView.coverImage = self.coverImage
        }
    }

    /**
     封面图url(先检测封面图,后检测封面图url,不传封面图就不显示)
     */
    var _coverImageUrl:String?
    var coverImageUrl:String?{
        get{
            _coverImageUrl
        }
        set{
            _coverImageUrl = newValue
            self.playerView?.controlView.coverImageUrl = self.coverImageUrl
        }
    }
    // MARK: -  回调
    /// 返回观看时间回调
    var popActionCallBack:popActionCallBackBlock?

    //播放器
    private var _playerView:CNLivePlayerView?
    private var playerView:CNLivePlayerView?{
        get{
            if (_playerView == nil) {
                _playerView = CNLivePlayerView()
                _playerView?.controlView.fullScreenType = .inCurrentViewOrientation
                _playerView?.popCallBack = {[weak self] in
                    if                     ((self!.popActionCallBack?(self!.playerView!.getPlayTime(), self!.playerView!.isUserStop, self!.playerView!.isPlayEnd)) != nil)
                    {
                        self!.popActionCallBack!(self!.playerView!.getPlayTime(), self!.playerView!.isUserStop, self!.playerView!.isPlayEnd)
                    }
                }
                _playerView?.switchAlphaMessageStateCallBack = { playerView in
                    UIView.animate(withDuration: kDSPlayerAnimateTimeInterval) {
                        if (playerView.controlView.isLockScreen || playerView.controlView.isAlphaMessage) {
                            self.isStatusBarHidden = true
                            self.setNeedsStatusBarAppearanceUpdate()
                        }else {
                            self.isStatusBarHidden = false
                        }
                    }
                }
                _playerView?.switchInterfaceOrientationCallBack = { playerView in
                    //全屏时不允许手势返回
                    if (playerView.controlView.isFullScreen!) {
                        self.popGestureRecognizerEnable = false
                    }else {
                        self.popGestureRecognizerEnable = true
                    }
                }
            }
            return _playerView
        }
        set{
            _playerView = newValue
            
        }
    }

    //是否是本地的url
    private var isLocalUrl:Bool = false
    
    var isStatusBarLight:Bool = true
    var isStatusBarHidden:Bool = true
    // MARK: - 播放链接
    /**
     初始化视频
     
     @param playUrl 视频链接地址 为空为停止播放
     @param isLive 是否为直播
     */
    func setPlayUrl(playUrl:URL,isLive:Bool){
        self.playUrl = playUrl
        self.isLive = isLive
        if self.playUrl?.scheme == "file"{
            self.isLocalUrl = true
        }else{
            self.isLocalUrl = false
        }
        self.playerView?.setPlayUrl(playUrl: self.playUrl!, isLive: self.isLive)
    }

    // MARK: - viewDidLoad
    override func viewDidLoad() {
        super.viewDidLoad()
        self.topNavView.removeFromSuperview()
        self.view.backgroundColor = .black
        self.view.addSubview(self.playerView!)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        isStatusBarLight = true
        setNeedsStatusBarAppearanceUpdate()
        self.playerView?.viewControllerIsDisappear = false
    }
    override var preferredStatusBarStyle: UIStatusBarStyle {
           let _ = super.preferredStatusBarStyle
        if isStatusBarLight == true{
            return UIStatusBarStyle.lightContent
        }else{
            return UIStatusBarStyle.default
        }
    }
    override var prefersStatusBarHidden: Bool{
        return self.isStatusBarHidden
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if (!self.isLocalUrl) {
//            if ([DSNetworkRequest shareClient].netStatus == DSNetworkStatusNotReachable) {
//                self.playerView.controlView.failureView.hidden = NO;
//                self.playerView.controlView.failureView.errorMessage = @"当前网络不可用,请检查网络后重试";
//                return;
//            }
//            if ([DSNetworkRequest shareClient].netStatus == DSNetworkStatusWWAN) {
//                DS_showMessage(@"当前正在用流量播放");
//            }
        }
        if (!self.playerView!.isUserStop && !self.playerView!.isPlayEnd) {
            self.playerView?.play()
        }
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        isStatusBarLight = false
        self.playerView?.viewControllerIsDisappear = true
    }
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.playerView?.stop()
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.playerView?.frame = CGRect(x: 0, y: 0, width: self.view.width, height: self.view.height)
    }
    deinit {
        print("CNLivePlayerViewController释放")
    }

    // MARK: - iPhoneX黑条隐藏
    override var prefersHomeIndicatorAutoHidden: Bool{
        return true
    }
}