NIMVideo
platform :ios, '8.0'
target 'xxx' do
pod 'NIMSDK', '5.5.0',:inhibit_warnings => true
end
Примечание: параметр inhibit_warnings позволяет эффективно подавлять предупреждения, возникающие при использовании сторонних библиотек, но иногда может вызывать неожиданные ошибки. Будьте осторожны при его использовании.
Найдите сервис WeChat NIM в интернете. Важно не путать его с WeChat, хотя это одна компания, но сайты разные. Я не смог найти демо-версию на этом сайте, искал долго и безуспешно, это был печальный опыт.
После того как вы нашли место для скачивания, перейдите вниз и выберите источник кода для iOS:
Откройте исходный проект и импортируйте соответствующие файлы в свой проект:
Поскольку SDK использует микрофон, необходимо добавить следующее в файл Info.plist:
Privacy - Microphone Usage Description
#import <NIMSDK/NIMSDK.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[AppDelegate configNIM];
return YES;
}
///云信配置
+(void)configNIM{
//推荐在程序启动的时候初始化 NIMSDK
NSString *appKey = @"xxx";
NIMSDKOption *option = [NIMSDKOption optionWithAppKey:appKey];
option.apnsCername = @"nil";
option.pkCername = @"nil";
[[NIMSDK sharedSDK] registerWithOption:option];
}
///跳转页面
-(void)jumpToVideoVC{
VideoVC *vc = [VideoVC new];
[self presentViewController:vc animated:YES completion:^{}];
}
///云信登录请求
- (void)getNimLoginWithShowHud:(BOOL)isShowHudErr response:(void(^)(NSError *error))response{
//云信登录
NSString *user_accid = @"xxx";
NSString *user_nimToken = @"xxx";
[[[NIMSDK sharedSDK] loginManager] login:user_accid token:user_nimToken completion:^(NSError *error) {
!response?:response(error);
if (error == nil){
NSString *userID = [NIMSDK sharedSDK].loginManager.currentAccount;
if (userID) {
NSString *nick = @"昵称";
NSString *headerUrl = @"https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLGrrnBlrnGDwlX6LOIhDv1UMicXKJ9jAv9TVicbVRmI6es3SkXU7bQrxziawS1LoR7CM54BNbrNTphg/132";
NSDictionary *dic = @{@(NIMUserInfoUpdateTagNick):nick,@(NIMUserInfoUpdateTagAvatar):headerUrl};
//更新昵称头像信息
[[NIMSDK sharedSDK].userManager updateMyUserInfo:dic completion:^(NSError *error) {
!response?:response(error);
}];
NSLog(@"云信登录成功");
}
}else{
if (isShowHudErr == YES) {
NSString *err = [NSString stringWithFormat:@"登录失败:%ld",(long)error.code];
NSLog(@"%@",err);
}
}
}];
}
/**
进入聊天室
@param roomId 聊天室id
@param completion 返回结果
*/
-(void)zm_enterChatroomWithRoomId:(NSString *_Nullable)roomId response:(nullable NIMChatroomEnterHandler)completion{
NIMUser *user = [[NIMSDK sharedSDK].userManager userInfo:[NIMSDK sharedSDK].loginManager.currentAccount];
NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init];
request.roomId = roomId;
request.roomNickname = user.userInfo.nickName;
request.roomAvatar = user.userInfo.avatarUrl;
[[[NIMSDK sharedSDK] chatroomManager] enterChatroom:request completion:^(NSError * _Nullable error, NIMChatroom * _Nullable chatroom, NIMChatroomMember * _Nullable me) {
``` **Текст на русском языке:**
!completion?:completion(error,chatroom,me); if (error == nil){
}else{
NSLog(@"进入失败 enter room %@ failed %@ code:%zd",chatroom.roomId,error,error.code);
}
}];
}
3、После входа в чат необходимо выполнить настройку видео, присоединиться к видеоконференции, вызвать окно видео и присоединиться к комнате видео:
```oc
//thirds
#import <NIMSDK/NIMSDK.h>
#import <NIMAVChat/NIMAVChat.h>
#import "NTESGLView.h"
//设备宽高
#define kIphone_W [UIScreen mainScreen].bounds.size.width
#define kIphone_H [UIScreen mainScreen].bounds.size.height
@interface VideoVC ()<NIMNetCallManagerDelegate>
///Видеоконфигурация
@property(nonatomic,copy)NIMNetCallVideoCaptureParam *param;
///Видеоконференция
@property(nonatomic,copy)NIMNetCallMeeting *meeting;
///Окно видео
@property(nonatomic,strong)NTESGLView *remoteGLView;
///Текущее имя камеры
@property (nonatomic, strong) NSString * currentCamare;
///
@property(nonatomic,copy)NSString *nimRoomName;
///Кнопка
@property(nonatomic,strong)UIButton *btn;
@end
#pragma mark - initial
- (void)viewDidLoad {
[super viewDidLoad];
[self setBaseData];
[self setBaseUI];
}
-(void)setBaseData{
self.nimRoomName = @"vchat_room_18";
self.currentCamare = @"vchat_room_18_user1";
//Присоединиться к комнате видео
[self joinNetCall:self with:self.nimRoomName];
}
-(void)setBaseUI{
self.view.backgroundColor = [UIColor purpleColor];
[self remoteGLView];
[self btn];
}
#pragma mark - NIMNetCallManager 云信管理
///Присоединиться к комнате
- (void)joinNetCall:(UIViewController<NIMNetCallManagerDelegate>)delegate with:(NSString *)roomName{
self.meeting.name = roomName;
[self joinNetCallWithRMeeting:self.meeting delegate:delegate];
}
//Присоединиться
- (void)joinNetCallWithRMeeting:(NIMNetCallMeeting *)rMeeting delegate:(UIViewController<NIMNetCallManagerDelegate>)vc{
NSLog(@"????===Подготовка к присоединению к конференции");
[[NIMAVChatSDK sharedSDK].netCallManager setMeetingRole:NO];//Режим зрителя
[[NIMAVChatSDK sharedSDK].netCallManager selectVideoAdaptiveStrategy:NIMAVChatVideoAdaptiveStrategySmooth];
[[NIMAVChatSDK sharedSDK].netCallManager addDelegate:vc];
[[NIMAVChatSDK sharedSDK].netCallManager joinMeeting:rMeeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nullable error) {
if (!error) {
NSLog(@"=========Присоединение к конференции успешно");
}else{
NSLog(@"%@",error.domain);
}
}];
}
//Покинуть комнату
- (void)leaveRoom:(NSString *)roomName delegate:(UIViewController<NIMNetCallManagerDelegate>)delegate{
self.meeting.name = roomName;
[[NIMAVChatSDK sharedSDK].netCallManager leaveMeeting:self.meeting];
[[NIMAVChatSDK sharedSDK].netCallManager removeDelegate:delegate];
[_remoteGLView removeFromSuperview];
_remoteGLView = nil;
self.meeting = nil;
self.param = nil;
}
#pragma mark - NIMNetCallManagerDelegate
//Удалённые данные YUV для видео готовы
//480*640
- (void)onRemoteYUVReady:(NSData *)yuvData width:(NSUInteger)width height:(NSUInteger)height from:(NSString *)user {
if ([user isEqualToString:self.currentCamare]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[_remoteGLView render:yuvData width:width height:height];
NSLog(@"\n?????\n%ld\n%@",yuvData.length,yuvData);
});
}
}
///Пользователь присоединился к многопользовательской конференции
- (void)onUserJoined:(NSString *)uid meeting:(NIMNetCallMeeting *)meeting{
}
//Громкость обратного вызова
-(void)onMyVolumeUpdate:(UInt16)volume{
//Обновить громкость пользовательского интерфейса
NSLog(@"%d",volume);
}
///Серверная запись информации обратного вызова
- (void)onNetCallRecordingInfo:(NIMNetCallRecordingInfo *)info{
}
///Текущая сетевая статусная информация для разговора
- (void)onNetStatus:(NIMNetCallNetStatus)status
user:(NSString *)user{
NSLog(@"Сетевое состояние:%ld and Пользователь :%@",(long)status,user);
if ([user isEqualToString:self.currentCamare]) {
// [self changeSignal:status];
}
}
#pragma mark - method
- (UIViewContentMode)videochatRemoteVideoContentMode
{
NSInteger setting = [[[NSUserDefaults standardUserDefaults] objectForKey:@"videochat_remote_video_content_mode"] integerValue];
return (setting == 0) ? UIViewContentModeScaleAspectFill : UIViewContentModeScaleAspectFit;
}
-(void)btnAction:(UIButton *)sender{
__weak
``` **typeof(self) weakSelf = self;**
[self dismissViewControllerAnimated:YES completion:^{
[weakSelf leaveRoom:weakSelf.nimRoomName delegate:weakSelf];
}];
**// #pragma mark - lazyload**
-(UIButton *)btn{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
_btn.frame = CGRectMake(100, 20, 100, 50);
_btn.backgroundColor = [UIColor redColor];
[_btn setTitle:@"点击返回" forState:UIControlStateNormal];
[_btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:_btn];
}
return _btn;
}
/// **Видео конфигурация**
- (void)fillVideoCaptureSetting:(NIMNetCallVideoCaptureParam *)param{
param.preferredVideoQuality = NIMNetCallVideoQuality480pLevel;
param.videoCrop = NIMNetCallVideoCrop4x3;
param.videoFrameRate = NIMNetCallVideoFrameRate20FPS;
param.videoHandler = ^(CMSampleBufferRef _Nonnull sampleBuffer) {
NSLog(@"%@",sampleBuffer);
};
}
- (NIMNetCallVideoCaptureParam *)param{
if (!_param) {
_param = [[NIMNetCallVideoCaptureParam alloc]init];
[self fillVideoCaptureSetting:_param];
}
return _param;
}
- (NIMNetCallMeeting *)meeting{
if (!_meeting) {
_meeting = [[NIMNetCallMeeting alloc] init];
_meeting.type = NIMNetCallMediaTypeVideo;
_meeting.actor = NO;
_meeting.option.voiceDetect = NO;
_meeting.option.videoCaptureParam = self.param;
_meeting.option.pureVideo = YES;
}
return _meeting;
}
-(NTESGLView *)remoteGLView{
if (!_remoteGLView) {
_remoteGLView = [[NTESGLView alloc] initWithFrame:CGRectMake(0, 100, kIphone_W, kIphone_W*0.75)];
_remoteGLView.backgroundColor = [UIColor greenColor];
[_remoteGLView setContentMode:[self videochatRemoteVideoContentMode]];
[_remoteGLView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:_remoteGLView];
}
return _remoteGLView;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )