Skip to content

Commit 23ca2e3

Browse files
authored
Merge pull request #5 from StreamUI/070124-streaming
Streaming to youtube is not fun
2 parents 26754ae + 5b53250 commit 23ca2e3

File tree

2 files changed

+68
-14
lines changed

2 files changed

+68
-14
lines changed

Sources/StreamUI/Recorders/Recorder.swift

+10-8
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,22 @@ public class Recorder {
2929
public var renderSettings: RenderSettings
3030
public var assetWriter: AVAssetWriter?
3131

32-
private var hud: HUD
32+
private var hud: HUD
3333

3434
public init(renderSettings: RenderSettings) {
3535
self.controlledClock = ControlledClock()
3636
self.frameTimer = FrameTimer(frameRate: Double(renderSettings.fps))
3737

3838
self.renderSettings = renderSettings
39-
self.hud = HUD()
39+
self.hud = HUD()
4040

4141
self.videoRecorder = VideoRecorder(renderSettings: renderSettings)
4242
self.audioRecorder = AudioRecorder(renderSettings: renderSettings, frameTimer: frameTimer)
4343
self.rtmpStreaming = RTMPStreaming(renderSettings: renderSettings)
4444

4545
videoRecorder.setParentRecorder(self)
4646
audioRecorder.setParentRecorder(self)
47-
hud.setRecorder(recorder: self)
47+
hud.setRecorder(recorder: self)
4848
}
4949

5050
@MainActor
@@ -100,27 +100,29 @@ public class Recorder {
100100
let start = clock.now
101101

102102
await captureFrame()
103-
let end = clock.now
104-
let elapsed = end - start
105103

106104
await controlledClock.advance(by: frameDuration)
105+
let end = clock.now
106+
let elapsed = end - start
107107
let sleepDuration = frameDuration - elapsed
108108

109109
if sleepDuration > .zero {
110+
// try await Task.sleep(for: .seconds(0.1))
110111
try await Task.sleep(for: sleepDuration)
112+
// try await Task.sleep(for: frameDuration)
111113
}
112-
self.hud.render()
114+
self.hud.render()
113115

114116
case .paused:
115-
self.hud.render()
117+
self.hud.render()
116118
try await Task.sleep(for: frameDuration)
117119

118120
case .finished, .idle:
119121
break
120122
}
121123
}
122124

123-
self.hud.render()
125+
self.hud.render()
124126
await finishRecording()
125127
}
126128
}

Sources/StreamUI/Streaming/RTMPStreaming.swift

+58-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ public class RTMPStreaming: ObservableObject {
1818

1919
private var rtmpStreams: [RTMPStream] = []
2020
private var rtmpConnections: [RTMPConnection] = []
21+
private var lastSampleBufferTimestamp: CMTime?
2122

23+
// Properties for frame rate logging
24+
private var frameCount: Int = 0
25+
private var startTime: Date?
26+
private let logInterval: TimeInterval = 5.0 // Log every 5 seconds
27+
2228
public init(renderSettings: RenderSettings) {
2329
self.renderSettings = renderSettings
2430
setupRTMPStreams()
@@ -42,11 +48,34 @@ public class RTMPStreaming: ObservableObject {
4248
}
4349

4450
private func configureRTMPStream(_ rtmpStream: RTMPStream, with streamSettings: LivestreamSettings) {
45-
rtmpStream.videoSettings.videoSize = CGSize(width: CGFloat(renderSettings.width), height: CGFloat(renderSettings.height))
46-
rtmpStream.videoSettings.profileLevel = streamSettings.profileLevel ?? kVTProfileLevel_H264_Main_AutoLevel as String
47-
rtmpStream.videoSettings.bitRate = streamSettings.bitRate ?? renderSettings.getDefaultBitrate()
48-
rtmpStream.videoSettings.maxKeyFrameIntervalDuration = 2
49-
rtmpStream.videoSettings.scalingMode = .trim
51+
// rtmpStream.videoSettings.videoSize = CGSize(width: CGFloat(renderSettings.width), height: CGFloat(renderSettings.height))
52+
// rtmpStream.videoSettings.profileLevel = streamSettings.profileLevel ?? kVTProfileLevel_H264_Main_AutoLevel as String
53+
// rtmpStream.videoSettings.bitRate = streamSettings.bitRate ?? renderSettings.getDefaultBitrate()
54+
// rtmpStream.videoSettings.profileLevel = kVTProfileLevel_H264_Baseline_AutoLevel as String
55+
// rtmpStream.videoSettings.bitRate = 1200 * 1000
56+
// rtmpStream.videoSettings.maxKeyFrameIntervalDuration = 2
57+
// rtmpStream.videoSettings.scalingMode = .trim
58+
59+
let bitrate = renderSettings.getDefaultBitrate()
60+
rtmpStream.frameRate = Double(renderSettings.fps)
61+
// stream.videoSettings.bitRateMode = .constant
62+
// rtmpStream.sessionPreset = .hd1920x1080
63+
rtmpStream.sessionPreset = .hd1920x1080
64+
// let bitrate = 6800 * 1000 // 6800 Kbps in bps
65+
66+
rtmpStream.videoSettings = VideoCodecSettings(
67+
videoSize: CGSize(width: renderSettings.width, height: renderSettings.height),
68+
bitRate: bitrate,
69+
// renderSettings.getDefaultBitrate(),
70+
// profileLevel: kVTProfileLevel_H264_Baseline_5_2 as String,
71+
// profileLevel: kVTProfileLevel_H264_Baseline_AutoLevel as String,
72+
profileLevel: kVTProfileLevel_H264_Main_AutoLevel as String,
73+
scalingMode: .trim,
74+
bitRateMode: .constant,
75+
maxKeyFrameIntervalDuration: 2
76+
)
77+
78+
// rtmpStream.bitrateStrategy = VideoAdaptiveNetBitRateStrategy(mamimumVideoBitrate: VideoCodecSettings.default.bitRate)
5079
}
5180

5281
public func startStreaming() {
@@ -60,6 +89,7 @@ public class RTMPStreaming: ObservableObject {
6089
}
6190

6291
isStreaming = true
92+
// resetFrameRateLogging()
6393
}
6494

6595
public func stopStreaming() {
@@ -77,17 +107,39 @@ public class RTMPStreaming: ObservableObject {
77107

78108
public func appendSampleBuffer(_ sampleBuffer: CMSampleBuffer) {
79109
guard isStreaming else { return }
80-
110+
81111
for rtmpStream in rtmpStreams {
82112
rtmpStream.append(sampleBuffer)
83113
}
114+
115+
// logFrameRate()
84116
}
85117

86118
@objc private func rtmpStatusHandler(_ notification: Notification) {
87119
// Handle RTMP status
120+
print("RTMP STATUS", notification)
88121
}
89122

90123
@objc private func rtmpErrorHandler(_ notification: Notification) {
124+
print("RTMP ERROR", notification)
91125
// Handle RTMP error
92126
}
127+
128+
private func resetFrameRateLogging() {
129+
frameCount = 0
130+
startTime = Date()
131+
}
132+
133+
private func logFrameRate() {
134+
frameCount += 1
135+
136+
guard let startTime = startTime else { return }
137+
138+
let elapsedTime = Date().timeIntervalSince(startTime)
139+
if elapsedTime >= logInterval {
140+
let frameRate = Double(frameCount) / elapsedTime
141+
print("Current frame rate: \(frameRate) fps")
142+
resetFrameRateLogging()
143+
}
144+
}
93145
}

0 commit comments

Comments
 (0)