Dioptra 5.1.15

Dioptra 5.1.15

Eugene FilipkovSergei Mikhan 维护。



Dioptra 5.1.15

  • 作者
  • Sergei Mikhan

Dioptra

一个基于 RX 的库,用于管理不同的视频播放类型。

Version License Platform

安装

pod 'Dioptra/AV', '~> 1.0'

主概念

这个库背后的主要思想是将控制视图和播放视图分离,以便客户端可以使用相同的界面进行播放。在这种情况下,您可以将自定义叠加控件放置在不同的播放源之上(如原生或 Dailymotion,例如)。控制视图和播放视图也都与 viewModel 连接,以便将逻辑与表示分离。

以下是以用户可执行主要操作的能力呈现的播放源界面,例如搜索、进度和播放/暂停。获取/设置播放静音、速率或可用质量

public protocol VideoPlayback: class {

  // input:
  associatedtype Stream: Equatable
  var input: Input<Stream> { get set }

  // params:
  var muted: Bool { get set }
  var quality: VideoQuality { get set }
  var speed: Double { set get }

  // RX input:
  var seek: PublishSubject<TimeInSeconds> { get }
  var state: PublishSubject<PlaybackState> { get }

  // RX output:
  var time: Driver<TimeInSeconds> { get }
  var duration: Driver<TimeInSeconds> { get }
  var loadedRange: Driver<LoadedTimeRange> { get }
  var playerState: Driver<PlayerState> { get }
  var seekCompleated: Driver<Void> { get }
  var speedUpdated: Driver<Double> { get }
  var availableQualities: Driver<[VideoQuality]> { get }
}

以下为默认控制界面,包含主要动作和属性列表,这些是对于 default 控制所必需的。

public protocol VideoControls: class {

  // RX inputs/outputs
  var visibilityChange: BehaviorRelay<VisibilityChangeEvent> { get }
  var screenMode: BehaviorRelay<ScreenMode> { get }

  // RX inputs
  var seekCompleted: PublishSubject<Void> { get }
  var buffer: PublishSubject<Float> { get }
  var progress: PublishSubject<Progress> { get }
  var state: PublishSubject<PlayerState> { get }
  var fullscreen: PublishSubject<Void> { get }

  // RX outputs
  var seek: Driver<SeekEvent> { get }
  var play: Driver<PlaybackState> { get }
}

这是具有搜索栏、时间/持续时间标签、播放/暂停按钮的默认控件视图。

可用的播放源

主要目标是让用户能够轻松替换不同的播放源,但同时使用相同的自定义播放控件。以下是可用的播放源列表

AV:基于AVKit的原生实现

基于常规AVLayer的实现。可以播放任何支持的流媒体视频。质量只适用于HLS,需要手动m3u8解析清单。您可以通过提供设置来配置此功能,还可以修改周期性更新计时器以设置所需的值

  public struct Settings {
    public init(retrieveQualities: Bool = false, periodicTimeUpdateInterval: CMTime = CMTime(value: 1, timescale: 10)) {
      self.retrieveQualities = retrieveQualities
      self.periodicTimeUpdateInterval = periodicTimeUpdateInterval
    }
    
    public let retrieveQualities: Bool
    public let periodicTimeUpdateInterval: CMTime
  }

DM:Dailymotion

基于WKWebView的实现,使用dailymotion-swift-player-sdk-ios.

BC:Brightcove

AV播放源的扩展。需要提供

open var accountID = ""
open var servicePolicyKey = ""

YT:YouTube

WKWebView基于的实现,使用youtube-ios-player-helper

功能

由于我们与相同的视图层次结构工作且能够从视频播放源中抽象出来,因此我们能够提供常用行为功能,如

全屏演示

在此处您可以找到全屏转换的自定义实现

present(modal: detailsViewController, method: TransitionMethod.fullscreen(presentingView: self.player))

滚动视图内分离玩家

此外,您还可以从容器视图中分离视频播放器

let frame = CGRect(x: 20.0, y: 20.0, width: 120.0, height: 120.0 * 9.0 / 16.0)
player.detach(to: containerViewController.view, with: frame)