L'encoder scende in congestione e risale piano; la regia imposta il pavimento, mostra lo stato del telefono e apre il selettore dal bitrate colorato. Co-authored-by: Cursor <cursoragent@cursor.com>
34 lines
1.1 KiB
Swift
34 lines
1.1 KiB
Swift
import Foundation
|
|
|
|
enum StreamVideoPreset {
|
|
struct Dimensions: Sendable {
|
|
let width: Int
|
|
let height: Int
|
|
}
|
|
|
|
static func dimensions(for qualityPreset: String?) -> Dimensions {
|
|
if qualityPreset?.hasPrefix("1080p") == true {
|
|
return Dimensions(width: 1920, height: 1080)
|
|
}
|
|
return Dimensions(width: 1280, height: 720)
|
|
}
|
|
|
|
static func broadcastConfig(for session: StreamSession, rtmpUrl: String) -> BroadcastConfig {
|
|
let dims = dimensions(for: session.qualityPreset)
|
|
let ceiling = StreamQualityLadder.encoderCeiling(
|
|
sessionTarget: session.targetBitrate,
|
|
minPresetId: session.minQualityPreset
|
|
)
|
|
let floor = StreamQualityLadder.encoderFloor(minPresetId: session.minQualityPreset, ceiling: ceiling)
|
|
return BroadcastConfig(
|
|
rtmpUrl: rtmpUrl,
|
|
width: dims.width,
|
|
height: dims.height,
|
|
videoBitrate: ceiling,
|
|
minVideoBitrate: floor,
|
|
audioBitrate: 128_000,
|
|
fps: session.targetFps
|
|
)
|
|
}
|
|
}
|