首页 > 其他分享 >阿里云点播SDK集成(二)封装篇

阿里云点播SDK集成(二)封装篇

时间:2024-09-26 11:35:04浏览次数:8  
标签:封装 height player let func playerStatus 点播 playSuperView SDK

1.上篇说到阿里云的文件上传以及注意的一些事项,今天就来说说简单的封装一下阿里云的播放器,简单说下思路(ps:在tableView或collectionView上用。为了节省资源以及滚动的流畅度,我们全局只用到1个播放器,提前加载视频并缓存本地,在滚动到当前视频的时候才去将播放器添加到cell上进行播放,滚动到下一个视频的时候会删除上一个播放器,网速好的情况下很流畅,其次也是看阿里云的视频解码速度 )

class PlayerManager: NSObject {
    /// 播放器superview
    let playSuperView = UIView()
    /// 播放器view
    let playView = UIView()
    /// 进度view
    fileprivate let progressView = UIProgressView()
    /// 播放器状态view
    fileprivate let playStatusImgView = UIImageView(image: UIImage(named: "icon_search_play"))
    /// 播放器
    let player = AliPlayer()
    /// 代理
    fileprivate weak var vc: PlayerListDelete!
    /// 当前正在播放视频的索引
    var currentIndex: Int = -1 {
        didSet{
            print("current index =>:\(currentIndex)")
        }
    }
    /// 播放状态 用来控制播放器播放状态
    fileprivate var playerStatus_: AVPStatus = AVPStatusIdle {
        didSet {
       //监听播放器状态,暂停就显示播放按钮,播放就隐藏播放按钮 playStatusImgView.isHidden = playerStatus_ == AVPStatusStarted } } weak var delegate: PlayerManagerDelegate? /// 实际播放状态 给外部使用 var playerStatus: AVPStatus = AVPStatusIdle /// 是否能够播放 var canPlay = true { didSet { if canPlay && isShow && playerStatus_ != AVPStatusPaused && playerStatus_ != AVPStatusStopped && playerStatus_ != AVPStatusError { resume() playStatusImgView.isHidden = true } else { player?.pause() playStatusImgView.isHidden = false } } } /// 构造函数 init(vc: VVPlayerListDelete) { super.init() self.vc = vc initPlayer() initUI() } fileprivate func initPlayer() { AliPrivateService.initLicense() player?.isLoop = false player?.isAutoPlay = true player?.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT let playConfig = player?.getConfig() playConfig?.clearShowWhenStop = true player?.setConfig(playConfig) player?.delegate = self AliListPlayer.setEnableLog(true) } fileprivate func initUI() { player?.playerView = playView playSuperView.backgroundColor = .black playSuperView.addSubview(playView) playSuperView.isHidden = true playStatusImgView.contentMode = .scaleAspectFit playStatusImgView.isHidden = true playSuperView.addSubview(playStatusImgView) playStatusImgView.snp.makeConstraints { (make) in make.center.equalToSuperview() } progressView.progressTintColor = .white progressView.backgroundColor = UIColor(white: 1, alpha: 0.2) progressView.isHidden = true playSuperView.addSubview(progressView) progressView.snp.makeConstraints { (make) in make.left.right.equalToSuperview() make.bottom.equalToSuperview().offset(0) make.height.equalTo(20) } }
   //适配大小 fileprivate func setPlayerscalingMode() { if let trackInfo = player?.getMediaInfo()?.tracks.first { if trackInfo.videoWidth < trackInfo.videoHeight { player?.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL } else { player?.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT } let width = SCREEN_WIDTH var height = playSuperView.frame.height let scaleX = (CGFloat)(trackInfo.videoHeight) / (CGFloat)(trackInfo.videoWidth) height = scaleX * width height = height > playSuperView.frame.height ? height : playSuperView.frame.height let criticalScale = height / playSuperView.frame.height if criticalScale >= 0.8 { height = playSuperView.frame.height } playView.frame = CGRect(x: 0, y: 0, width: width, height: height) } } }

2.封装播放组件api

// MARK:- 外部使用api
extension PlayerManager {
    /// 停止播放
    func stop() {
        player?.stop()
        playerStatus_ = AVPStatusStopped
        delegate?.playStatusChange(isPause: false)
    }
    
    /// 暂停
    func pause() {
        player?.pause()
        playerStatus_ = AVPStatusPaused
        delegate?.playStatusChange(isPause: true)
    }
    
    /// 恢复播放
    func resume() {
        player?.start()
        playerStatus_ = AVPStatusStarted
        delegate?.playStatusChange(isPause: false)
    }
    
    /// 播放指定索引的视频
    func playAtIndex(index: Int, vid: String) {
        progressView.setProgress(0, animated: false)
        currentIndex = index
        playSuperView.frame = vc.playerList(playerManager: self, frameForIndexAt: index)
        player?.playerView.frame = playSuperView.bounds
        let source = AVPVidStsSource()
        source.vid = vid
        source.region = STSManager.shared.region
        source.securityToken = STSManager.shared.securityToken
        source.accessKeySecret = STSManager.shared.accessKeySecret
        source.accessKeyId = STSManager.shared.accessKeyId
        self.player?.setStsSource(source)
        self.player?.prepare()
        if canPlay {
            resume()
        } else {
            player?.pause()
        }
    }
    
    /// 单击暂停或者播放
    func singleTap() {
        switch playerStatus_ {
        case AVPStatusStarted:
            pause()
        default:
            resume()
        }
    }
    
    func removePlayView() {
        playSuperView.removeFromSuperview()
        playSuperView.isHidden = true
        player?.stop()
        currentIndex = -1
    }
    
    /// 移除某个video
    func removeVideo(index: Int) {
        currentIndex = -1
    }
    
    func updatePlayerStatus(withControllerStatus status: PlayerListControllerStatus) {
        if status == .active {
            canPlay = true
        } else {
            canPlay = false
        }
    }
    
}

3.根据代理设置监听,涉及到播放进度或者播放完成等一些事件可以在这里监听

extension VVPlayerManager: AVPDelegate {
    
    func one rror(_ player: AliPlayer!, errorModel: AVPErrorModel!) {
        playerStatus_ = AVPStatusStopped
        if errorModel.code.rawValue == 537198597 || errorModel.code.rawValue == 537067523 {
            delegate?.playerManage(AuthorityExpired: self)
        }
        print("________playermanager________ 播放失败 => \(String(describing: errorModel.message))")
        VVSTSManager.shared.updateSts()
    }
    
    func onPlayerEvent(_ player: AliPlayer!, eventType: AVPEventType) {
        print("________playermanager________ \(eventType)")
        switch eventType {
        case AVPEventPrepareDone:
            setPlayerscalingMode()
        case AVPEventFirstRenderedStart:
            playSuperView.isHidden = false
        case AVPEventLoopingStart:
            //一次完整视频播放完成
            self.delegate?.aCompletePlaybackIsCompleted()
        case AVPEventCompletion:
            self.delegate?.playbackCompleted()
        default:
            break
        }
    }
    
    func onPlayerStatusChanged(_ player: AliPlayer!, oldStatus: AVPStatus, newStatus: AVPStatus) {
        playerStatus = newStatus
    }
    
    func onl oadingProgress(_ player: AliPlayer!, progress: Float) {
        
    }
    
    func onCurrentPositionUpdate(_ player: AliPlayer!, position: Int64) {
        let duration: Float = Float(player.duration)
        let position: Float = Float(position)
        let current: Float = position / duration
        self.delegate?.playChange(progressVaues: current, totalProgress: duration, currentProgress: position)
    }
    
}

以上就是阿里云播放器的简单封装,有问题的请在下方评论,看到后第1时间回复

 

标签:封装,height,player,let,func,playerStatus,点播,playSuperView,SDK
From: https://www.cnblogs.com/wm941142146/p/18433132

相关文章

  • 【解决了一个小问题】aws s3 sdk 中的自定义header设置哪些不参与aws v4 签名
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯在通过代理访问s3服务端的时候,s3服务端返回类似的错误信息:<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><Error><Code>AuthorizationQueryParametersE......
  • 如何正确的在项目中接入微信JS-SDK
    微信JS-SDK的功能如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的......
  • 如何正确的在项目中接入微信JS-SDK
    微信JS-SDK的功能如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的......
  • 有理数类封装
    上一版运算过程中会炸inlineintabsl(intx){returnx>0?x:~x+1;}inlinereaminrea(reax,reay){returnx<y?x:y;}inlineintmin(intx,inty){returnx<y?x:y;}structrea{intmu,zi;reajian(){intgcd=__gcd(absl(zi),absl(mu));if(mu&......
  • 阿里云点播SDK集成(一)上传篇
    目前项目中用到的就是阿里云的点播包括视频上传及播放,有做短视频的宝子们可以借鉴一下,避免少走弯路 1.省略开通或配置阿里云点播服务的平台配置,直接是iOS移动端部分,podSDK尽量用最新的#阿里云播放器pod'AliPlayerSDK_iOS'#阿里云文件上传pod'VODUpload'2.获取STS服......
  • 进阶美颜功能技术开发方案:探索视频美颜SDK
    视频美颜SDK(SoftwareDevelopmentKit)作为提升视频质量的重要工具,越来越多地被开发者关注与应用。接下俩,笔者将深入探讨进阶美颜功能的技术开发方案,助力开发者更好地利用视频美颜SDK。 一、视频美颜SDK的核心功能视频美颜SDK的核心功能主要包括人脸检测、肤色调整、磨皮美白、祛斑去......
  • 直播平台美颜功能开发方案:基于视频美颜SDK的集成详解
    本篇文章,小编将于大家共同探究视频美颜SDK的美颜功能开发方案,帮助开发者深入理解其集成过程及关键技术。 一、美颜功能的重要性在竞争激烈的直播市场中,直播平台如何提升用户体验至关重要。美颜功能不仅能够改善主播的形象,提升观众的观看体验,还能增强互动性,增加用户留存率。优秀的......
  • 应用targetSdkVersion升级指导
    应用targetSdkVersion升级指导应电信终端产业协会(TAF)发布的《移动应用软件高API等级预置与分发自律公约》(以下简称《公约》)要求:截止到2019年5月1日所有新发布的应用API必须为26或更高,2019年8月1日现有应用API必须升级为26或更高。《公约》发布至今得到了国内主流互联......
  • Android连接蓝牙自定义封装SDK(基于Cordova与ionic)
    今天给大家分享一款基于Cordova与ionic框架自定义封装的Android手机连接蓝牙的插件。自己公司遇到的业务需求是,与第三方公司合作,需要在项目现场打印项目物资与物料验收单,后期提供给财务核对报销等。第三方公司提供蓝牙打印机与手持机,我们需要自己结合业务开发相对应的功能。......
  • java封装题目3
    3.以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名,作者,出版社名,价格;方法包括:信息介绍show()要求:1)设置属性的私有访问权限,通过公有的get,set方法实现对属性的访问2)限定价格必须大于10,如果无效进行提示3)限定作者,书名为只读属性4)设计构造方法实现对属性......