VideoPlaybackKit 0.2.3

VideoPlaybackKit 0.2.3

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年9月
SwiftSwift 版本3.0
SPM支持 SPM

Sonam Dhingra 维护。



 
依赖
ASValueTrackingSlider>= 0
Alamofire~> 4.4
AlamofireImage~> 3.1
SnapKit~> 3.2.0
 

  • 作者
  • Sonam Dhingra 和 thoughtbot

摘要

这个框架使用了 VIPER 架构(修改为 VIPE)。它从一个对架构本身的实验开始,现在还在开发中。

这是一个围绕 AVFoundation 框架的 swift 包装器。使用它来在简单的视图或源中播放远程或本地视频。它的目的是让你在 iOS 应用程序中轻松地播放渐进式下载和直播流。

免责声明

这个框架还在开发中。单元测试、VIPE 重构和错误修复正在进行中。

功能

  • [x] 滚动视频
  • [x] 在主线程中处理播放或停止视频
  • [x] 在 UITableView 中播放
  • [x] 自动播放视频
  • [x] 支持 HTTPS
  • [x] 使用 Swift 编写
  • [x] 支持横屏
  • [x] 支持 Cocoapod

要求

  • iOS 10.0 或更高版本
  • Xcode 8.3 或更高版本

入门

  • 转到“DemoVideoPlaybackKit”文件夹,运行 pod install。打开工作区并构建

关于

在 iOS 社区中讨论了 VIPER 架构;然而,它不常用。我们希望深入了解这种设计模式,了解所有这些热议的焦点。因此,我们决定测试以下假设:

作为一个开发者,我希望使用 VIPER 设计模式来构建可重用模块

我们决定实验 VIPER 和播放视频内容。播放视频涉及 UI 更新、数据下载和数据同步。这些复杂性和交互证明了自己是一个值得考虑的 VIPER 结构化模块的候选者。

沟通

  • 如果你 发现了一个错误,打开一个问题。
  • 如果你 有一个功能请求,打开一个问题。
  • 如果你 想要贡献,提交一个 pull request。

安装

  • 执行 pod install ‘VideoPlaybackKit’

如何使用

import VideoPlaybackKit

在视图中播放单个视频 - 将包含视频内容的单个视图添加到屏幕上

  1. 定义视频类型(本地或远程)。这是在VIPER结构中表示的实体
let videoType = VPKVideoType.local(videoPathName: "Elon_Musk", fileType: "mp4", placeholderImageName: "elon_1")
  1. 构建视频视图
VPKVideoPlaybackBuilder.vpk_buildVideoView(for: videoType, shouldAutoplay: self.shouldAutoPlay, playbackBarTheme: self.toolBarTheme) { [weak self] (videoView) in

        self?.view.addSubview(videoView)
        videoView.snp.makeConstraints({ (make) in
        make.height.equalTo(self?.view.snp.height).dividedBy(2)
        make.top.equalTo(self?.view.snp.top).offset(10)
        make.left.right.equalTo(self?.view)
    })
}

在动态列表中播放视频

  1. 创建一个符合VPKViewInCellProtocol的UITabieViewCell
class VideoTableViewCell: UITableViewCell, VPKViewInCellProtocol {
    static let identifier = "VideoCell"
    var videoView: VPKVideoView? {
        didSet {
            self.setupVideoViewConstraints()
            layoutIfNeeded()
        }
    }
    
    override func prepareForReuse() {
        super.prepareForReuse()
        prepareForVideoReuse() //Extension default
    }
}
  1. 在UIViewController中注册单元格,设置表格视图。将videoview添加到单元格
    tableView.register(VideoTableViewCell.self, forCellReuseIdentifier: VideoTableViewCell.identifier)
    tableView.estimatedRowHeight = 400
    tableView.rowHeight = UITableViewAutomaticDimension

    datasource.asObservable().bind(to: tableView.rx.items(cellIdentifier: VideoTableViewCell.identifier)) { index, model, cell in
            
        guard let cell = cell as? VideoTableViewCell else { return }

        VPKVideoPlaybackBuilder.vpk_buildViewInCell(for: model, at: NSIndexPath(item: index, section: 0), completion: { [weak self] (videoView) in
                cell.videoView = videoView
                cell.layoutIfNeeded()
        })}.addDisposableTo(disposeBag)

        tableView.rx.setDelegate(self)
}

在动态列表中自动播放视频

  1. 遵守VPKTableViewVideoPlaybackScrollable协议

实现以下内容

extension FeedViewController: VPKTableViewVideoPlaybackScrollable {

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        handleAutoplayInTopVideoCell() // default implementation
        trackVideoViewCellScrolling() // default implementation
    }   

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        if shouldAutoplayVideos {
            handleAutoplayInTopVideoCell()
        }
    }
}

在动态列表中播放视频,预取视频内容数据。***特别推荐用于动态列表中的自动播放视频***

  1. 创建一个VPKTableViewPrefetchSynchronizer对象
videoPrefetcher = VPKTableViewPrefetchSynchronizer(videoItems: datasource.value)
  1. 遵守UITableViewDataSourcePrefetching表格视图协议
tableView.prefetchDataSource = self

extension FeedViewController: UITableViewDataSourcePrefetching {

    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
        videoPrefetcher?.tableView(tableView, prefetchRowsAt: indexPaths)
    }

    func tableView(_ tableView: UITableView, cancelPrefetchingForRowsAt indexPaths: [IndexPath]) {
        videoPrefetcher?.tableView(tableView, cancelPrefetchingForRowsAt: indexPaths)
    }
}

联系方式: