测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | MIT |
Released最新发布 | 2017年3月 |
SwiftSwift版本 | 3.0 |
SPM支持SPM | ✗ |
由陈锡维护。
TinyPlayer是一个简单、优雅且效率极高的iOS和tvOS视频播放器,基于Apple的AVFoundation框架。
作为我们Quazer[http://apple.co/2blYuqq]应用程序的核心播放器组件,我们在构建它的时候遵循了行业最佳实践,最大限度地利用了Apple的AVFoundation框架。AVFoundation功能强大,但是控制起来并不容易。为了发挥其最大潜能,经验丰富的开发者也需要一些时间去正确设置一切。我们通过提供一个易于使用的播放器组件,来减轻那些需要在应用中添加媒体播放支持的开发者的工作量,这个组件封装了所有复杂性。
要运行示例项目,首先克隆仓库,然后在Examples
目录中运行pod install
。打开TinyPlayerDemo+Benchmark.xcworkspace
并选择一个构建方案来运行。
工作空间中目前有两个可执行方案
TinyPlayerDemo
:通过使用基于MVVM的设置将播放器链接到UIViewController的一个简单演示。为了避免额外的依赖,我们没有在这里使用绑定机制来建立视图控制器和视图模型之间的UI更新链接。相反,我们使用了大多数iOS开发者都应该熟悉的代理模式。然而,这种方法会增加一些结构复杂性。在实际项目中,我们强烈建议您利用SwiftBond或ReactiveCocoa等绑定框架之一。以下图表显示了项目内部的类关系。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) {
…
}
项目的目标是保持项目的轻量级和简洁。因此,我将继续专注于玩家功能层,而不是在表示层上投入过多精力。
欢迎任何贡献和pull请求!在你开始实施新功能或试图修复一个不确定的问题之前,我们非常感谢你首先发起一次讨论。
Chen Xi(Kevin) [xiaohu557],[email protected]
TinyPlayer可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。