设计视频播放器 SDK
问题
如何设计一个可扩展的 iOS 视频播放器 SDK?
答案
分层架构
引擎抽象
protocol PlayerEngine: AnyObject {
var currentTime: TimeInterval { get }
var duration: TimeInterval { get }
var state: PlayerState { get }
var statePublisher: AnyPublisher<PlayerState, Never> { get }
func play(url: URL)
func pause()
func seek(to time: TimeInterval)
func setRate(_ rate: Float)
}
// AVPlayer 实现
class AVPlayerEngine: PlayerEngine {
private let player = AVPlayer()
// 通过 KVO 和 timeObserver 实现属性和事件
}
插件系统
protocol PlayerPlugin {
func onPlayerStateChanged(_ state: PlayerState)
func onTimeUpdate(currentTime: TimeInterval, duration: TimeInterval)
func onPlayerViewReady(_ view: UIView)
}
// 弹幕插件
class DanmakuPlugin: PlayerPlugin {
func onTimeUpdate(currentTime: TimeInterval, duration: TimeInterval) {
// 根据时间点展示弹幕
}
}
常见面试问题
Q1: 为什么要抽象引擎层?
答案:不同场景可能需要不同引擎(AVPlayer 播放 HLS、IJKPlayer 播放 FLV)。抽象后可以运行时切换引擎,上层 UI 和插件不感知。