feat: 支持手动切换采集帧率
在 Android、Web 及 Flutter 控制端新增帧率选择 UI,被控端按屏幕刷新率生成支持的帧率档位并上报,允许在保持分辨率不变的情况下仅切换帧率。 另附带更新信号服务器的数据库配置。
This commit is contained in:
@@ -34,6 +34,8 @@ struct ControlMessage {
|
||||
var height: Int32 = 0 // field 13, varint
|
||||
var fps: Int32 = 0 // field 14, varint
|
||||
var streamMode: Int32 = 0 // field 15, varint (0=WebRTC 1=自编码)
|
||||
/// 被控端支持的帧率档位列表(REPORT_RESOLUTION 上报,按屏幕刷新率筛选,升序)。
|
||||
var supportedFps: [Int32] = [] // field 16, repeated varint (packed)
|
||||
|
||||
// MARK: - Encode
|
||||
|
||||
@@ -54,6 +56,16 @@ struct ControlMessage {
|
||||
w.writeVarintField(13, UInt64(bitPattern: Int64(height)))
|
||||
w.writeVarintField(14, UInt64(bitPattern: Int64(fps)))
|
||||
w.writeVarintField(15, UInt64(bitPattern: Int64(streamMode)))
|
||||
// repeated int32 supported_fps = 16(packed 编码);空列表不编码
|
||||
if !supportedFps.isEmpty {
|
||||
var payload = ProtoWriter()
|
||||
for v in supportedFps {
|
||||
payload.writeVarint(UInt64(bitPattern: Int64(v)))
|
||||
}
|
||||
w.writeVarint(UInt64(16 << 3 | 2))
|
||||
w.writeVarint(UInt64(payload.data.count))
|
||||
w.data.append(payload.data)
|
||||
}
|
||||
return w.data
|
||||
}
|
||||
|
||||
@@ -81,6 +93,19 @@ struct ControlMessage {
|
||||
case (13, 0): guard let v = r.readVarint() else { return nil }; msg.height = Int32(truncatingIfNeeded: Int64(bitPattern: v))
|
||||
case (14, 0): guard let v = r.readVarint() else { return nil }; msg.fps = Int32(truncatingIfNeeded: Int64(bitPattern: v))
|
||||
case (15, 0): guard let v = r.readVarint() else { return nil }; msg.streamMode = Int32(truncatingIfNeeded: Int64(bitPattern: v))
|
||||
case (16, 2):
|
||||
// packed repeated int32:先读长度,再在区间内逐个读 varint
|
||||
guard let len = r.readVarint() else { return nil }
|
||||
let end = r.offset + Int(len)
|
||||
guard end <= data.endIndex else { return nil }
|
||||
while r.offset < end {
|
||||
guard let v = r.readVarint() else { return nil }
|
||||
msg.supportedFps.append(Int32(truncatingIfNeeded: Int64(bitPattern: v)))
|
||||
}
|
||||
case (16, 0):
|
||||
// 兼容非 packed 编码(逐项 varint)
|
||||
guard let v = r.readVarint() else { return nil }
|
||||
msg.supportedFps.append(Int32(truncatingIfNeeded: Int64(bitPattern: v)))
|
||||
default:
|
||||
// 未知字段按 wire type 跳过
|
||||
if !r.skip(wireType: wire) { return nil }
|
||||
|
||||
Reference in New Issue
Block a user