Пример стримера для iOS
Данный стример может использоваться для публикации WebRTC-видеопотока с Web Call Server.
...
Слева отображается видео с камеры, справа воспроизводится опубликованный поток.
Работа с кодом примера
Для разбора кода возьмем версию примера Streamer, которая доступена для скачивания в сборке 2.5.2.
...
Code Block | ||||
---|---|---|---|---|
| ||||
- (FPWCSApi2Stream *)publishStream { FPWCSApi2Session *session = [FPWCSApi2 getSessions][0]; FPWCSApi2StreamOptions *options = [[FPWCSApi2StreamOptions alloc] init]; options.name = streamName; options.display = _videoView.local; if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) { options.constraints = [[FPWCSApi2MediaConstraints alloc] initWithAudio:YES videoWidth:640 videoHeight:480 videoFps:15]; } NSError *error; publishStream = [session createStream:options error:&error]; if (!publishStream) { UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Failed to publish" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [self onUnpublished]; }]; [alert addAction:okButton]; [self presentViewController:alert animated:YES completion:nil]; return nil; } [publishStream on:kFPWCSStreamStatusPublishing callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onPublishing:rStream]; }]; [publishStream on:kFPWCSStreamStatusUnpublished callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onUnpublished]; }]; [publishStream on:kFPWCSStreamStatusFailed callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onUnpublished]; }]; ... if(![publishStream publish:&error]) { UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Failed to publish" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [self onUnpublished]; }]; [alert addAction:okButton]; [self presentViewController:alert animated:YES completion:nil]; } return publishStream; } |
...
Code Block | ||||
---|---|---|---|---|
| ||||
- (FPWCSApi2Stream *)playStream { FPWCSApi2Session *session = [FPWCSApi2 getSessions][0]; FPWCSApi2StreamOptions *options = [[FPWCSApi2StreamOptions alloc] init]; options.name = streamName; options.display = _videoView.remote; NSError *error; playStream = [session createStream:options error:nil]; if (!playStream) { UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Failed to play" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { [self onStopped]; }]; [alert addAction:okButton]; [self presentViewController:alert animated:YES completion:nil]; return nil; } [playStream on:kFPWCSStreamStatusPlaying callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onPlaying:rStream]; }]; [playStream on:kFPWCSStreamStatusNotEnoughtBandwidth callback:^(FPWCSApi2Stream *rStream){ NSLog(@"Not enough bandwidth stream %@, consider using lower video resolution or bitrate. Bandwidth %ld bitrate %ld", [rStream getName], [rStream getNetworkBandwidth] / 1000, [rStream getRemoteBitrate] / 1000); [self changeStreamStatus:rStream]; }]; [playStream on:kFPWCSStreamStatusStopped callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onStopped]; }]; [playStream on:kFPWCSStreamStatusFailed callback:^(FPWCSApi2Stream *rStream){ [self changeStreamStatus:rStream]; [self onStopped]; }];... if(![playStream play:&error]) { UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Failed to play" message:error.localizedDescription preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* okButton = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { }]; [alert addAction:okButton]; [self presentViewController:alert animated:YES completion:nil]; } return playStream; } |
...