TinyPlayer 1.1.0

TinyPlayer 1.1.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
Released最新发布2017年3月
SwiftSwift版本3.0
SPM支持SPM

陈锡维护。



  • 作者:
  • xiaohu557

TinyPlayer

TinyPlayer是一个简单、优雅且效率极高的iOS和tvOS视频播放器,基于Apple的AVFoundation框架。

为什么不使用AVPlayer?

作为我们Quazer[http://apple.co/2blYuqq]应用程序的核心播放器组件,我们在构建它的时候遵循了行业最佳实践,最大限度地利用了Apple的AVFoundation框架。AVFoundation功能强大,但是控制起来并不容易。为了发挥其最大潜能,经验丰富的开发者也需要一些时间去正确设置一切。我们通过提供一个易于使用的播放器组件,来减轻那些需要在应用中添加媒体播放支持的开发者的工作量,这个组件封装了所有复杂性。

功能

  • 轻量级
  • 简单:只需几行代码即可集成
  • 现代:充分利用iOS/tvOS 10的现代API
  • 高效
  • 灵活控制
  • 多种格式:支持所有常用视频/音频格式(mpeg/mov/avi/mp4/ts/mp3/aac/ac3/…)。
  • 流式传输/HLS:支持视频流式传输和HLS
  • Airplay
  • CommandCenter

示例

要运行示例项目,首先克隆仓库,然后在Examples目录中运行pod install。打开TinyPlayerDemo+Benchmark.xcworkspace并选择一个构建方案来运行。

工作空间中目前有两个可执行方案

  • TinyPlayerDemo:通过使用基于MVVM的设置将播放器链接到UIViewController的一个简单演示。为了避免额外的依赖,我们没有在这里使用绑定机制来建立视图控制器和视图模型之间的UI更新链接。相反,我们使用了大多数iOS开发者都应该熟悉的代理模式。然而,这种方法会增加一些结构复杂性。在实际项目中,我们强烈建议您利用SwiftBond或ReactiveCocoa等绑定框架之一。以下图表显示了项目内部的类关系。

Class relations in TinyPlayerDemo

  • TinyPlayerBenchmark:该项目展示了TinyPlayer如何高效运行,它基于典型的MVC架构。我们的最新测试显示,iPhone 6s能够在屏幕上同时处理多达16个玩家,而它们都在播放720p内容。总内存消耗仅为7.2 MB!自己试试吧。😉

要求

由于之前的系统版本缺少某些API支持,TinyPlayer的最低系统要求为iOS 9.1+和tvOS 9.1+。整个项目使用Swift 3构建。

安装

通过CocoaPods可以获得TinyPlayer。要安装它,只需将以下行添加到Podfile中

pod "TinyPlayer"

使用

你可以将TinyPlayer视为一个数据模型管理器,它向外界暴露一个互联的视图实例,以提供轻松集成到现有视图层次结构的功能。状态处理和业务逻辑封装在内部以避免复杂性。你可以通过在TinyPlayer协议中定义的暴露接口与之交互。

你可以通过URL启动它

import TinyPlayer

let mediaUrl = 
let player = TinyVideoPlayer(resourceUrl: mediaUrl)

我们建议将玩家实例放在你的视图模型中。要将玩家视图附加到你的其中一个视图控制器,在你的视图控制器的加载过程中放置以下几行,如下所示

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let aPlayerView = player.playerView
    self.view.addSubview(aPlayerView)
}

完成!现在你可以向玩家实例发送命令,例如

/// start playback
player.play()

/// or stop playback
player.pause()

/// or seek to some position
player.seekTo(position: xxx)

/// or seek to some position with completion closure
player.seekTo(position: xxx, cancelPreviousSeeking: true) { succeed in
    /// do something…
}

/// or close the playing media item to release its memory
player.closeCurrentItem()

/// or reset playback of the current media item
player.resetPlayback()

有时你可能想要指定一个播放上下文,或者想要精确控制播放内容。在这种情况下,你可以像这样使用MediaContext结构

let mediaContext = MediaContext(videoTitle: “Example”,
                                artistName: "TinyPlayerDemo”,
                                startPosition: 5.0,   /// start playing from this position
                                endPosition: 0.0,     /// play to the end of the video
                                thumbnailImage: UIImage(some image…))
let player = TinyVideoPlayer(resourceUrl: mediaUrl, mediaContext: mediaContext)

为了能够对玩家的状态变化做出反应,你可以将一个委托赋给玩家实例

player.delegate = self

然后你可以选择实现以下委托方法来获得更多控制

func player(_ player: TinyPlayer, didChangePlaybackStateFromState oldState: TinyPlayerState, toState newState: TinyPlayerState) {
    …     
}

func player(_ player: TinyPlayer, didUpdatePlaybackPosition position: Float, playbackProgress: Float) {
    …     
}

func player(_ player: TinyPlayer, didUpdateBufferRange range: ClosedRange<Float>) {
    …     
}

func player(_ player: TinyPlayer, didUpdateSeekableRange range: ClosedRange<Float>) {
    …     
}

public func player(_ player: TinyPlayer, didEncounterFailureWithError error: Error) {
    …     
}

func playerIsReadyToPlay(_ player: TinyPlayer) {
    …     
}

func playerHasFinishedPlayingVideo(_ player: TinyPlayer) {
    …     
}

下一步

项目的目标是保持项目的轻量级和简洁。因此,我将继续专注于玩家功能层,而不是在表示层上投入过多精力。

  • 广告播放支持
  • VAST标准支持
  • 离线视频内容缓存
  • API参考

贡献

欢迎任何贡献和pull请求!在你开始实施新功能或试图修复一个不确定的问题之前,我们非常感谢你首先发起一次讨论。

维护者

Chen Xi(Kevin) [xiaohu557],[email protected]

许可证

TinyPlayer可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。