// // SCViewController.m // SellyCloudSDK // // Created by Caleb on 07/07/2025. // Copyright (c) 2025 Caleb. All rights reserved. // #import "SCViewController.h" #import "Masonry/Masonry.h" #import "SCLivePusherViewController.h" #import #import "SCVideoPlayerViewController.h" #import "UIView+SellyCloud.h" #import "SellyVideoCallViewController.h" #import "SellyVideoCallConferenceController.h" @interface SCViewController () @property (weak, nonatomic) IBOutlet UISwitch *audioOnlySwi; @property (weak, nonatomic) IBOutlet UITextField *maxBitrateTf; @property (weak, nonatomic) IBOutlet UITextField *minBitrateTf; @property (weak, nonatomic) IBOutlet UITextField *fpsTf; @property (weak, nonatomic) IBOutlet UITextField *videoSizeTf; @property (weak, nonatomic) IBOutlet UITextField *pushNameTf; @property (weak, nonatomic) IBOutlet UITextField *playNameTf; @property (weak, nonatomic) IBOutlet UISegmentedControl *seg; @property (weak, nonatomic) IBOutlet UITextField *p2pChannelTf; @property (weak, nonatomic) IBOutlet UITextField *conferenceChannelTf; @property (nonatomic, assign) CGSize videoSize; //视频最终输出分辨率,可以随意设置,最好不要超过采集分辨率 @property (nonatomic, assign) SellyLiveVideoSessionPreset sessionPreset; //视频采集分辨率 @end @implementation SCViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // int randomNumber = 100 + arc4random_uniform(900); // self.p2pChannelTf.text = [NSString stringWithFormat:@"test%d",randomNumber]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = UIColor.whiteColor; self.title = @"首页"; const char *kiwiAppkey = "5XTXUZ/aqOwfjA4zQkY7VpjcNBucWxmNGY4vFNhwSMKWkn2WK383dbNgI+96Y+ttSPMFzqhu8fxP5SiCK5+/6cGrBQQt8pDQAOi3EN4Z6lzkC2cJ5mfjBVi4ZpFASG9e3divF5UqLG6sTmFI3eCuJxy9/kHXPSSkKWJe1MnBMQETpf4FRDVuR9d/LzXKQgA9PsjRbPRLx4f3h0TU2P4GEfv1c70FvkdwpqirQt9ik2hAhKuj0vJY60g+yYhGY19a07vBTW4MprN53RnSH8bCs79NNbWyzsg2++t+sKdZP1WPGeOho/xpsQRP8yWCXIOOdvdjiE3YXVltBgmPnA6gOjFS97WVlBAQ1mJE7rQi+/5hhfTuJlWoBH6000SRe7dc5EA0WGQX9U1Aj96ahBQhyHTrHJySmJ/hRMYMudqByF6K4PtrwZ8zugTjtx1dyLPOonZDlTu7hPAIcUfuaQ9xS3Phbq8lP67EYDsr3pkWuwL6AjrPjFwNmi0P1g+hV1ZQUmDQVGhNHmF3cE9Pd5ZOS10/fwaXYGRhcq9PlUSmcbU3scLtrBlzpOslyjlQ6W57EudCrvvJU3mimfs1A2y7cjpnLlJN1CWh6dQAaGcwSG2QA8+88qmlMH1t627fItTgHYrP1DkExpAr2dqgYDvsICJnHaRSBMe608GrPbFaECutRz5y3BEtQKcVKdgA1e6W4TFnxs5HqGrzc8iHPOOKGf8zHWEXkITPBKEiA86Nz46pDrqM9FKx4upPijn4Dahj8pd7yWTUIdHBT8X39Vm3/TSV5xT/lTinmv8rhBieb/2SQamTjVQ22VFq3nQ1h4TxUYTEc0nSjqcz54fWf1cyBy7uh82q1weKXUAJ8vG9W05vmt3/aDZ9+C8cWm53AQ90xgDvW7M1mZveuyfof2qrPsXTpj+jhpDkJgm6qJsvV5ClmGth8gvCM0rHjSIwxhYDZaIDK5TkFWjwLltt+YhhYLKketwuTHdlO/hCxrsFzlXHhXGVRC+kgXusfQUrHIm1WjW9o9EqasHg9ufUgg7cMO/9FRZhJ+Xdw9erprYDvu84Da9jL6NUUOSNIGTCJ/s29Lz4SIwCVG2lzm2UhD6E9ipGfG9gc6e/2vt1emOsP3/ipHVJf16r/9S4+dGKIjPX6QcHIIL2AMu2Je07nPmEoz7KaeOShox4bG3puMQdkdQo6kRIFpUzwUty+4EWqHmyPHGkGGGfI8gj0EreiZwgVJmBQ/8S5wlK+iUp+TVeoXo="; [SellyCloudManager.sharedInstance startWithKey:@"" appName:@"live"]; //初始化洋葱盾相关 [SellyCloudManager setKiwiAppKey:kiwiAppkey name:"123"]; int randomNumber = 100 + arc4random_uniform(900); self.pushNameTf.text = [NSString stringWithFormat:@"test%d",randomNumber]; self.playNameTf.text = @"test"; self.fpsTf.text = @"18"; NSInteger defaultQuality = 360; if(defaultQuality == 360) { //360 self.maxBitrateTf.text = @"2000"; self.minBitrateTf.text = @"1000"; self.videoSizeTf.text = @"360*640"; self.videoSize = CGSizeMake(360, 640); self.sessionPreset = SellyLiveVideoResolution640x360; } else if(defaultQuality == 540){ //540 self.maxBitrateTf.text = @"3500"; self.minBitrateTf.text = @"1000"; self.videoSizeTf.text = @"540*960"; self.videoSize = CGSizeMake(540, 960); self.sessionPreset = SellyLiveVideoResolution960x540; } else if(defaultQuality == 720){ //720 self.maxBitrateTf.text = @"5000"; self.minBitrateTf.text = @"1000"; self.videoSizeTf.text = @"720*1280"; self.videoSize = CGSizeMake(720, 1280); self.sessionPreset = SellyLiveVideoResolution1280x720; } self.seg.selectedSegmentIndex = 1; //音视频聊天配置 self.p2pChannelTf.text = @"test123"; self.conferenceChannelTf.text = @"test1123"; [SellyRTCEngine.sharedEngine startUp]; SellyRTCEngine.sharedEngine.userId = self.pushNameTf.text; SellyRTCEngine.sharedEngine.supportSimulcast = false; } - (IBAction)startLive:(id)sender { SellyPlayerStreamInfo *streamInfo = SellyPlayerStreamInfo.new; streamInfo.streamId = self.pushNameTf.text; streamInfo.protocol = (self.seg.selectedSegmentIndex?@"rtc":@"rtmp"); SellyLiveVideoConfiguration *videoConfig = SellyLiveVideoConfiguration.defaultConfiguration; videoConfig.videoBitRate = self.maxBitrateTf.text.integerValue*1000; videoConfig.videoMinBitRate = self.minBitrateTf.text.integerValue*1000; videoConfig.videoFrameRate = self.fpsTf.text.integerValue; videoConfig.videoSize = self.videoSize; videoConfig.sessionPreset = self.sessionPreset; videoConfig.videoMaxKeyframeInterval = videoConfig.videoFrameRate*2; //2秒一个关键帧 videoConfig.autorotate = false; videoConfig.outputImageOrientation = UIInterfaceOrientationPortrait; SCLivePusherViewController *vc = SCLivePusherViewController.new; vc.streamInfo = streamInfo; vc.audioOnly = self.audioOnlySwi.on; vc.videoConfig = videoConfig; [self.navigationController pushViewController:vc animated:true]; } - (IBAction)startPlay:(id)sender { SellyPlayerStreamInfo *streamInfo = SellyPlayerStreamInfo.new; streamInfo.streamId = self.playNameTf.text; streamInfo.protocol = (self.seg.selectedSegmentIndex?@"rtc":@"rtmp"); SCVideoPlayerViewController *vc = SCVideoPlayerViewController.new; vc.streamInfo = streamInfo; [self.navigationController pushViewController:vc animated:true]; } - (void)updateVideoSize:(NSString *)title { NSInteger width = [[title componentsSeparatedByString:@"*"].firstObject integerValue]; NSInteger height = [[title componentsSeparatedByString:@"*"].lastObject integerValue]; self.videoSize = CGSizeMake(height, width); } - (IBAction)startP2p:(id)sender { SellyRTCVideoConfiguration *config = SellyRTCVideoConfiguration.defaultConfig; config.frameRate = [self.fpsTf.text integerValue]; config.maxBitrate = [self.maxBitrateTf.text integerValue]*1000; config.minBitrate = [self.minBitrateTf.text integerValue]*1000; SellyVideoCallViewController *vc = SellyVideoCallViewController.new; vc.channelId = self.p2pChannelTf.text; vc.videoConfig = config; [self.navigationController pushViewController:vc animated:true]; } - (IBAction)startConference:(id)sender { SellyRTCVideoConfiguration *config = SellyRTCVideoConfiguration.defaultConfig; config.frameRate = [self.fpsTf.text integerValue]; config.maxBitrate = [self.maxBitrateTf.text integerValue]*1000; config.minBitrate = [self.minBitrateTf.text integerValue]*1000; SellyVideoCallConferenceController *vc = SellyVideoCallConferenceController.new; vc.channelId = self.conferenceChannelTf.text; vc.videoConfig = config; [self.navigationController pushViewController:vc animated:true]; } // 阻止键盘出现 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if (textField == self.videoSizeTf) { [self showVideoSize]; return false; } return true; } - (void)showVideoSize { UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"请选择分辨率" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertVc addAction:[UIAlertAction actionWithTitle:@"360*480" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution480x360; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"480*480" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution480x480; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"360*640" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution640x360; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"480*640" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution640x480; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"540*960" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution960x540; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"720*1280" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { self.videoSizeTf.text = action.title; self.sessionPreset = SellyLiveVideoResolution1280x720; [self updateVideoSize:action.title]; }]]; [alertVc addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alertVc animated:true completion:nil]; } - (IBAction)uploadLog:(id)sender { [SellyCloudManager uploadLog:^(NSString * _Nullable url, NSError * _Nullable error) { if (error) { [self.view showToast:error.localizedDescription]; } else { [UIPasteboard generalPasteboard].string = url; [self.view showToast:@"日志上传成功,谢谢您的反馈。\n日志url已复制到剪贴板,可以粘贴之后发给别人哦~"]; } }]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.view endEditing:true]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end