Chamada de áudio e vídeo WebRTC - chamadas paralelas do iOS ossrs streaming ao vivo
Antes de implementar o terminal iOS para chamar o serviço ossrs, o artigo mencionava streaming. Não escrevi o processo de streaming, então o WebRTCClient do artigo será usado. Verifique em detalhes: https://blog.csdn.net/gloryFlow/article/details/132262724
1. Efeito de streaming do player iOS
2. Realize a chamada de ossrs no lado iOS para extrair fluxos
Recentemente, um amigo perguntou e descobri que faltava uma parte do processo de streaming antes, então vou adicioná-la aqui.
2.1. Defina WebRTCClient ao extrair o stream
Inicialize ao configurar WebRTCClient ao extrair o stream, isPublish为false
aqui
#pragma mark - Lazy
- (WebRTCClient *)webRTCClient {
if (!_webRTCClient) {
_webRTCClient = [[WebRTCClient alloc] initWithPublish:NO];
}
return _webRTCClient;
}
2.2 Defina a visualização da tela para exibição de streaming.
A exibição da tela da câmera no artigo anterior usa startCaptureLocalVideo, mas o streaming precisa ser configuradoremoteRenderView
Existe uma definição no WebRTCClient:
/**
RTCVideoRenderer
*/
@property (nonatomic, weak) id<RTCVideoRenderer> remoteRenderView;
Definir a visualização da tela para exibição de streaming
#import "RTCPlayView.h"
@interface RTCPlayView ()
@property (nonatomic, strong) WebRTCClient *webRTCClient;
@property (nonatomic, strong) RTCEAGLVideoView *remoteRenderer;
@end
@implementation RTCPlayView
- (instancetype)initWithFrame:(CGRect)frame webRTCClient:(WebRTCClient *)webRTCClient {
self = [super initWithFrame:frame];
if (self) {
self.webRTCClient = webRTCClient;
self.remoteRenderer = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero];
self.remoteRenderer.contentMode = UIViewContentModeScaleAspectFit;
[self addSubview:self.remoteRenderer];
self.webRTCClient.remoteRenderView = self.remoteRenderer;
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
self.remoteRenderer.frame = self.bounds;
NSLog(@"self.remoteRenderer frame:%@", NSStringFromCGRect(self.remoteRenderer.frame));
}
@end
Crie RTCEAGLVideoView usado aqui, definaself.webRTCClient.remoteRenderView为self.remoteRenderer
2.3. Chame o serviço ossrs play, a interface é rtc/v1/play/
O processo de implementação da chamada do fluxo pull é semelhante ao do fluxo push, portanto não será explicado aqui, consulte https://blog.csdn.net/gloryFlow/article/details/132262724
O método específico é o seguinte
- (void)playBtnClick {
__weak typeof(self) weakSelf = self;
[self.webRTCClient offer:^(RTCSessionDescription *sdp) {
[weakSelf.webRTCClient changeSDP2Server:sdp urlStr:@"https://192.168.10.102:1990/rtc/v1/play/" streamUrl:@"webrtc://192.168.10.102:1990/live/livestream" closure:^(BOOL isServerRetSuc) {
NSLog(@"isServerRetSuc:%@",(isServerRetSuc?@"YES":@"NO"));
}];
}];
}
O código completo do controlador é o seguinte
#import "RTCPlayViewController.h"
@interface RTCPlayViewController ()<WebRTCClientDelegate>
@property (nonatomic, strong) WebRTCClient *webRTCClient;
@property (nonatomic, strong) RTCPlayView *rtcPlayView;
@property (nonatomic, strong) UIButton *playBtn;
@end
@implementation RTCPlayViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.rtcPlayView = [[RTCPlayView alloc] initWithFrame:CGRectZero webRTCClient:self.webRTCClient];
[self.view addSubview: self.rtcPlayView];
self.rtcPlayView.backgroundColor = [UIColor lightGrayColor];
self.rtcPlayView.frame = self.view.bounds;
CGFloat screenWidth = CGRectGetWidth(self.view.bounds);
CGFloat screenHeight = CGRectGetHeight(self.view.bounds);
self.playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
self.playBtn.frame = CGRectMake(50, screenHeight - 160, screenWidth - 2*50, 46);
self.playBtn.layer.cornerRadius = 4;
self.playBtn.backgroundColor = [UIColor grayColor];
[self.playBtn setTitle:@"publish" forState:UIControlStateNormal];
[self.playBtn addTarget:self action:@selector(playBtnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.playBtn];
self.webRTCClient.delegate = self;
}
- (void)playBtnClick {
__weak typeof(self) weakSelf = self;
[self.webRTCClient offer:^(RTCSessionDescription *sdp) {
[weakSelf.webRTCClient changeSDP2Server:sdp urlStr:@"https://192.168.10.102:1990/rtc/v1/play/" streamUrl:@"webrtc://192.168.10.102:1990/live/livestream" closure:^(BOOL isServerRetSuc) {
NSLog(@"isServerRetSuc:%@",(isServerRetSuc?@"YES":@"NO"));
}];
}];
}
#pragma mark - WebRTCClientDelegate
- (void)webRTCClient:(WebRTCClient *)client didDiscoverLocalCandidate:(RTCIceCandidate *)candidate {
NSLog(@"webRTCClient didDiscoverLocalCandidate");
}
- (void)webRTCClient:(WebRTCClient *)client didChangeConnectionState:(RTCIceConnectionState)state {
NSLog(@"webRTCClient didChangeConnectionState");
/**
RTCIceConnectionStateNew,
RTCIceConnectionStateChecking,
RTCIceConnectionStateConnected,
RTCIceConnectionStateCompleted,
RTCIceConnectionStateFailed,
RTCIceConnectionStateDisconnected,
RTCIceConnectionStateClosed,
RTCIceConnectionStateCount,
*/
UIColor *textColor = [UIColor blackColor];
BOOL openSpeak = NO;
switch (state) {
case RTCIceConnectionStateCompleted:
case RTCIceConnectionStateConnected:
textColor = [UIColor greenColor];
openSpeak = YES;
break;
case RTCIceConnectionStateDisconnected:
textColor = [UIColor orangeColor];
break;
case RTCIceConnectionStateFailed:
case RTCIceConnectionStateClosed:
textColor = [UIColor redColor];
break;
case RTCIceConnectionStateNew:
case RTCIceConnectionStateChecking:
case RTCIceConnectionStateCount:
textColor = [UIColor blackColor];
break;
default:
break;
}
dispatch_async(dispatch_get_main_queue(), ^{
NSString *text = [NSString stringWithFormat:@"%ld", state];
[self.playBtn setTitle:text forState:UIControlStateNormal];
[self.playBtn setTitleColor:textColor forState:UIControlStateNormal];
if (openSpeak) {
[self.webRTCClient speakOn];
}
// if textColor == .green {
// self?.webRTCClient.speakerOn()
// }
});
}
- (void)webRTCClient:(WebRTCClient *)client didReceiveData:(NSData *)data {
NSLog(@"webRTCClient didReceiveData");
}
#pragma mark - Lazy
- (WebRTCClient *)webRTCClient {
if (!_webRTCClient) {
_webRTCClient = [[WebRTCClient alloc] initWithPublish:NO];
}
return _webRTCClient;
}
@end
Até agora, o streaming de videochamada ossrs do lado iOS pode ser realizado
Outros
Antes de configurar o serviço ossrs, você pode verificar: https://blog.csdn.net/gloryFlow/article/details/132257196
Antes de implementar o iOS para fazer chamadas de áudio e vídeo ossrs, você pode verificar: https://blog. csdn.net/gloryFlow /article/details/132262724
Antes que as chamadas de áudio e vídeo WebRTC não exibissem imagens de alta resolução, você pode verificar: https://blog.csdn.net/gloryFlow/article/details/132240952
Modifique a taxa de bits no SDP, você pode verificar: https://blog.csdn.net/gloryFlow/article/details/132263021
Filtro de beleza de vídeo de videochamada GPUImage, você pode visualizar: https://blog.csdn.net/gloryFlow/article/details /132265842
Vídeo local ao vivo RTC ou vídeo do álbum, você pode visualizar: https://blog.csdn.net/gloryFlow/article/details/132267068
3. Resumo
Chamada de áudio e vídeo WebRTC - chamadas paralelas do iOS ossrs streaming ao vivo. WebRTC é usado para chamar ossrs para obter o efeito de streaming push-pull. Existem muitos conteúdos e a descrição pode ser imprecisa, por favor, me perdoe.
https://blog.csdn.net/gloryFlow/article/details/132417602
Registros de aprendizagem, continue melhorando a cada dia.