first commit
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
import Foundation
|
||||
|
||||
/// 播放器引擎类型
|
||||
enum PlayerEngine: Int, CaseIterable, Identifiable {
|
||||
case system = 0
|
||||
case vlc = 10
|
||||
|
||||
var id: Int { rawValue }
|
||||
|
||||
var title: String {
|
||||
switch self {
|
||||
case .system:
|
||||
return "系统播放器"
|
||||
case .vlc:
|
||||
return "VLC播放器"
|
||||
}
|
||||
}
|
||||
|
||||
static var isVLCAvailable: Bool {
|
||||
#if canImport(VLCKitSPM)
|
||||
return true
|
||||
#else
|
||||
return false
|
||||
#endif
|
||||
}
|
||||
|
||||
static var availableEngines: [PlayerEngine] {
|
||||
var engines: [PlayerEngine] = [.system]
|
||||
if isVLCAvailable {
|
||||
engines.append(.vlc)
|
||||
}
|
||||
return engines
|
||||
}
|
||||
|
||||
static func fromStoredValue(_ rawValue: Int) -> PlayerEngine {
|
||||
guard let engine = PlayerEngine(rawValue: rawValue) else {
|
||||
return .system
|
||||
}
|
||||
|
||||
if engine == .vlc && !isVLCAvailable {
|
||||
return .system
|
||||
}
|
||||
|
||||
return engine
|
||||
}
|
||||
}
|
||||
|
||||
/// 视频解码模式
|
||||
enum VideoDecodeMode: Int, CaseIterable, Identifiable {
|
||||
case auto = 0
|
||||
case hardware = 1
|
||||
case software = 2
|
||||
|
||||
var id: Int { rawValue }
|
||||
|
||||
var title: String {
|
||||
switch self {
|
||||
case .auto:
|
||||
return "自动"
|
||||
case .hardware:
|
||||
return "硬解码"
|
||||
case .software:
|
||||
return "软解码"
|
||||
}
|
||||
}
|
||||
|
||||
static func fromStoredValue(_ rawValue: Int) -> VideoDecodeMode {
|
||||
VideoDecodeMode(rawValue: rawValue) ?? .auto
|
||||
}
|
||||
|
||||
/// VLC 媒体选项
|
||||
var vlcHardwareDecodeOption: String? {
|
||||
switch self {
|
||||
case .auto:
|
||||
// 自动模式默认硬解优先,异常时用户仍可手动切到软解。
|
||||
return "any"
|
||||
case .hardware:
|
||||
return "any"
|
||||
case .software:
|
||||
return "none"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// VLC 缓冲策略
|
||||
enum VLCBufferMode: Int, CaseIterable, Identifiable {
|
||||
case lowLatency = 0
|
||||
case balanced = 1
|
||||
case smooth = 2
|
||||
|
||||
var id: Int { rawValue }
|
||||
|
||||
var title: String {
|
||||
switch self {
|
||||
case .lowLatency:
|
||||
return "低延迟"
|
||||
case .balanced:
|
||||
return "均衡"
|
||||
case .smooth:
|
||||
return "流畅优先"
|
||||
}
|
||||
}
|
||||
|
||||
static var defaultMode: VLCBufferMode { .balanced }
|
||||
|
||||
static func fromStoredValue(_ rawValue: Int) -> VLCBufferMode {
|
||||
VLCBufferMode(rawValue: rawValue) ?? defaultMode
|
||||
}
|
||||
|
||||
var enableFrameDrop: Bool {
|
||||
self == .lowLatency
|
||||
}
|
||||
|
||||
func cacheConfig(isLive: Bool) -> (network: Int, live: Int, file: Int) {
|
||||
switch self {
|
||||
case .lowLatency:
|
||||
if isLive {
|
||||
return (network: 1200, live: 1200, file: 1600)
|
||||
}
|
||||
return (network: 1800, live: 1600, file: 2400)
|
||||
case .balanced:
|
||||
if isLive {
|
||||
return (network: 2600, live: 2600, file: 3200)
|
||||
}
|
||||
return (network: 3800, live: 3200, file: 4400)
|
||||
case .smooth:
|
||||
if isLive {
|
||||
return (network: 4200, live: 4200, file: 5200)
|
||||
}
|
||||
return (network: 5600, live: 4800, file: 6400)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user