Riduce reload MediaMTX in live e allinea ingest mobile al preset qualità.
Evita patch recording ripetute che distruggevano i muxer HLS (500 ops) e fa encoderare 1080p/720p con codec e bitrate coerenti al wizard. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -173,6 +173,7 @@ struct StreamSessionDto: Decodable {
|
||||
let privacyStatus: String?
|
||||
let targetBitrate: Int?
|
||||
let targetFps: Int?
|
||||
let qualityPreset: String?
|
||||
let startedAt: String?
|
||||
let score: ScoreStateDto?
|
||||
|
||||
@@ -191,6 +192,7 @@ struct StreamSessionDto: Decodable {
|
||||
privacyStatus: privacyStatus ?? "public",
|
||||
targetBitrate: targetBitrate ?? 2_500_000,
|
||||
targetFps: targetFps ?? 30,
|
||||
qualityPreset: qualityPreset ?? "720p_30_2.5mbps",
|
||||
startedAt: startedAt,
|
||||
score: score?.toDomain()
|
||||
)
|
||||
|
||||
@@ -118,6 +118,7 @@ struct StreamSession: Identifiable, Equatable, Sendable {
|
||||
let privacyStatus: String
|
||||
let targetBitrate: Int
|
||||
let targetFps: Int
|
||||
let qualityPreset: String
|
||||
let startedAt: String?
|
||||
let score: ScoreState?
|
||||
|
||||
|
||||
@@ -334,7 +334,9 @@ final class LiveBroadcastEngine: ObservableObject {
|
||||
videoSettings.videoSize = .init(width: config.width, height: config.height)
|
||||
videoSettings.bitRate = config.videoBitrate
|
||||
videoSettings.maxKeyFrameIntervalDuration = 2
|
||||
videoSettings.profileLevel = kVTProfileLevel_H264_Baseline_3_1 as String
|
||||
videoSettings.profileLevel = config.height > 720
|
||||
? (kVTProfileLevel_H264_Baseline_4_1 as String)
|
||||
: (kVTProfileLevel_H264_Baseline_3_1 as String)
|
||||
videoSettings.expectedFrameRate = Double(config.fps)
|
||||
try await stream.setVideoSettings(videoSettings)
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
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)
|
||||
return BroadcastConfig(
|
||||
rtmpUrl: rtmpUrl,
|
||||
width: dims.width,
|
||||
height: dims.height,
|
||||
videoBitrate: session.targetBitrate,
|
||||
audioBitrate: 128_000,
|
||||
fps: session.targetFps
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -505,13 +505,9 @@ struct BroadcastScreen: View {
|
||||
}
|
||||
|
||||
private func broadcastConfig(for loaded: StreamSession, rtmpUrl: String) -> BroadcastConfig {
|
||||
BroadcastConfig(
|
||||
rtmpUrl: RtmpIngestUrl.resolveForDevice(rtmpUrl),
|
||||
width: 1280,
|
||||
height: 720,
|
||||
videoBitrate: loaded.targetBitrate,
|
||||
audioBitrate: 128_000,
|
||||
fps: loaded.targetFps
|
||||
StreamVideoPreset.broadcastConfig(
|
||||
for: loaded,
|
||||
rtmpUrl: RtmpIngestUrl.resolveForDevice(rtmpUrl)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user