diff --git a/ScreenShare/SampleHandler.swift b/ScreenShare/SampleHandler.swift index 6f625e3..71d6a87 100644 --- a/ScreenShare/SampleHandler.swift +++ b/ScreenShare/SampleHandler.swift @@ -9,9 +9,14 @@ import ReplayKit import WebRTCiOSSDK import WebRTC +import CoreVideo +import CoreImage +import CoreMedia -class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { +class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { + let sharedDefault = UserDefaults(suiteName: "group.io.antmedia.sbd.webrtc.sample")! // for test + func clientHasError(_ message: String) { let userInfo = [NSLocalizedFailureReasonErrorKey: message] @@ -21,6 +26,32 @@ class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { func publishStarted(streamId: String) { NSLog("Publish has started"); +// self.client.setFrameCapturer { [weak self] buffer, frame in +// guard let self, let requiredFrame = self.sharedDefault.object(forKey: "screenShareFrame") as? [CGFloat] else { +// return frame +// } +// +// // topSafeArea iPhone 12 mini +// let topSafeArea: CGFloat = 44 +// let convertedFrame = convertRectToBufferFrame( +// rect: .init(x: requiredFrame[0], y: requiredFrame[1] + topSafeArea, width: requiredFrame[2], height: requiredFrame[3]), +// screenSize: UIScreen.main.bounds.size, +// bufferSize: frame.size +// ) +// return convertedFrame +// } + } + + func convertRectToBufferFrame(rect: CGRect, screenSize: CGSize, bufferSize: CGSize) -> CGRect { + let scaleX = bufferSize.width / screenSize.width + let scaleY = bufferSize.height / screenSize.height + + let projectedX = rect.origin.x * scaleX + let projectedY = rect.origin.y * scaleY + let projectedWidth = rect.size.width * scaleX + let projectedHeight = rect.size.height * scaleY + + return CGRect(x: projectedX, y: projectedY, width: projectedWidth, height: projectedHeight) } func publishFinished(streamId: String) { @@ -40,15 +71,14 @@ class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) { // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional. - let sharedDefault = UserDefaults(suiteName: "group.io.antmedia.ios.webrtc.sample")! +// original: group.io.antmedia.ios.webrtc.sample streamId = sharedDefault.object(forKey: "streamId") as! String; let url = sharedDefault.object(forKey: "url"); - let token = sharedDefault.object(forKey: "token"); +// let token = sharedDefault.object(forKey: "token") ; let videoEnabledObject = sharedDefault.object(forKey:"videoEnabled") as! String; - if videoEnabledObject == "false" - { + if videoEnabledObject == "false" { videoEnabled = false; } @@ -57,9 +87,10 @@ class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { audioEnabled = false; } - if ((streamId) == nil) - { - let userInfo = [NSLocalizedFailureReasonErrorKey: "StreamId is not specified. Please specify stream id in the container app"] + if ((streamId).isEmpty) { + let userInfo = [ + NSLocalizedFailureReasonErrorKey: "StreamId is not specified. Please specify stream id in the container app" + ] finishBroadcastWithError(NSError(domain: "ScreenShare", code: -1, userInfo: userInfo)); } @@ -69,36 +100,34 @@ class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { finishBroadcastWithError(NSError(domain: "ScreenShare", code: -2, userInfo: userInfo)); } else { - NSLog("----> streamId: %@ , websocket url: %@, videoEnabled: %d , audioEnabled: %d", streamId as! String, url as! String, + NSLog("----> streamId: %@ , websocket url: %@, videoEnabled: %d , audioEnabled: %d", streamId, url as! String, videoEnabled, audioEnabled); self.client.delegate = self self.client.setDebug(true) self.client.setUseExternalCameraSource(useExternalCameraSource: true) self.client.setWebSocketServerUrl(url: url as! String) - - if (videoEnabled != nil) { - self.client.setVideoEnable(enable: videoEnabled as! Bool); + + if (videoEnabled != false) { + self.client.setVideoEnable(enable: videoEnabled); self.client.setExternalVideoCapture(externalVideoCapture: true); } //in some ipad versions, resolution/aspect ratio is critical to set, otherwise iOS encoder may not encode the frames and //server side reports publishTimeout because server cannot get the video frames - self.client.setTargetResolution(width: 1280, height: 720); - self.client.setMaxVideoBps(videoBitratePerSecond: 2000000) - + + self.client.setTargetResolution(width: 1920, height: 1080); + self.client.setMaxVideoBps(videoBitratePerSecond: 5000000) self.client.setExternalAudio(externalAudioEnabled: true) //In some devices iphone version, frames are dropped due to encoder queue and it causes glitches in the playback //Decreasing the fps provides a better playback expeience. //Alternatively, target resolution can be decreased above to let encoder work faster - self.client.setTargetFps(fps: 10) + self.client.setTargetFps(fps: 30) - self.client.publish(streamId: streamId as! String); + self.client.publish(streamId: streamId); } - - } override func broadcastPaused() { @@ -119,7 +148,7 @@ class SampleHandler: RPBroadcastSampleHandler, AntMediaClientDelegate { // Handle video sample buffer //NSLog("processSamplebuffer video"); if videoEnabled { - self.client.deliverExternalVideo(sampleBuffer: sampleBuffer); + self.client.deliverExternalVideo(sampleBuffer: sampleBuffer) } break case RPSampleBufferType.audioApp: diff --git a/ScreenShare/ScreenShare.entitlements b/ScreenShare/ScreenShare.entitlements index 2099144..3e03c56 100644 --- a/ScreenShare/ScreenShare.entitlements +++ b/ScreenShare/ScreenShare.entitlements @@ -4,7 +4,8 @@ com.apple.security.application-groups - group.io.antmedia.ios.webrtc.sample + group.io.antmedia.sbd.webrtc.sample + group.io.sbd.chatdemo diff --git a/WebRTC-Sample-App/Base.lproj/Main.storyboard b/WebRTC-Sample-App/Base.lproj/Main.storyboard index 9796ef7..f19da1f 100644 --- a/WebRTC-Sample-App/Base.lproj/Main.storyboard +++ b/WebRTC-Sample-App/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -19,7 +19,7 @@ - + @@ -27,17 +27,17 @@ - + - + @@ -59,14 +59,14 @@ WebRTC Live Streaming - + - + +