即时通讯(IM)开源项目OpenIM每周迭代版本发布-音视频实时通话-v2.0.4

介绍

OpenIM每周五发布新版,包括新特性发布,bug修复,同时合并PR

由于2.0版本重构完毕,架构更清晰,代码更规范,先邀请各位参与OpenIM社区建设,包括技术开发,技术分享等,特性开发,性能优化,bug修复等,有兴趣的同学可以加我私聊。

可以多人音视频聊天,以及多端同步呼叫。

web端体验:https://open-im-online.rentsoft.cn/

安卓端体验:https://www.pgyer.com/OpenIM

iOS端体验:https://testflight.apple.com/join/79cQqBYd

项目成果

项目整体超过7K star,我们继续努力争做开源IM的领跑者,请大家多多支持。消息通过经过压测和可靠性测试,请放心用于生产环境。

性能及容量总结

服务器资源:8核16G内存, 6个机械磁盘,每个磁盘100G, 用于mongo分片,10MB带宽。

容量:用户容量10万以上,消息条数10亿条。

性能评估:同时在线用户10万,每秒钟发送消息900条,消息延时1秒(从发送者发出消息到接收到消息)

可靠性总结

启动sdk,模拟50个用户在线、离线情况,消息可靠性100%。

发送10万消息,有3条失败,其他消息都能被对方精确收到,并成功落地本地db。对于失败的3条消息,接收方确实没有收到,系统消息是一致的。

github地址:https://github.com/OpenIMSDK/Open-IM-Server

开发者中心:https://doc.rentsoft.cn/#/

本周版本 客户端SDK  v2.0.3 &&服务端  v2.0.4

特性类别

群聊已读,发送者能看到本条消息哪些人已读,哪些人未读,对于办公场景极为有用新特性

音视频通话优化,信令通道建设新特性

消息发送失败,点击可重新发送新特性

消息免打扰,接收但不提醒新特性

动态表情包添加新特性

聊天背景设置新特性

etcd在keepalive失败时容错bug修复

聊天记录中昵称和头像实时同步,多端同步bug修复

发消息 好友权限验证 ,可配置bug修复

docker镜像v2.0.4 已更新,请拉取最新镜像, 见文档:https://doc.rentsoft.cn/#/demo/server_deploy/docker_singe

OpenIM每周都会迭代发布新版本,别值得注意的是,版本号的第一位数字代表大版本,一般是做了协议改造升级,服务器和客户端两者必须保持大版本一致。

分支说明:

(1)dev:外部开发者在此分支上提交pr;

(2)tuoyun:OpenIM内部专用;

(3)main:最新可用分支;(建议大家用tag版本)

开发中的特性

特性预计完成时间

私聊消息可选择阅后即焚3月25日

删除历史记录云端同步3月25日

群管理:解散群,禁言,昵称修改等4月1日

第三方通知类型:比如oa通知,hr通知等4月1日

音视频通话相关rtc信令接口

音视频监听回调说明

音视频通话监听,在login之前调用SetSignalingListener(callback open_im_sdk_callback.OnSignalingListener)设置

type OnSignalingListener interface {

//被邀请者收到:音视频通话邀请

OnReceiveNewInvitation(receiveNewInvitationCallback string)

receiveNewInvitationCallback为

{

"opUserID": "18666662412", 

    "invitation": {

"inviterUserID": "18666662412", 

        "inviteeUserIDList": [

            "18349115126"

], 

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab", 

"roomID": "room_id_111", 

"timeout": 1000, 

"mediaType": "video", 

        "sessionType": 2

}, 

    "offlinePushInfo": { }

}

//邀请者收到:被邀请者同意音视频通话

OnInviteeAccepted(inviteeAcceptedCallback string)

inviteeAcceptedCallback为

{

"opUserID": "18349115126",

"invitation": {

"inviterUserID": "18666662412",

"inviteeUserIDList": ["18349115126"],

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab",

"roomID": "room_id_111",

"timeout": 1000,

"mediaType": "video",

"sessionType": 2

},

"offlinePushInfo": {}

}

//邀请者收到:被邀请者拒绝音视频通话

OnInviteeRejected(inviteeRejectedCallback string)

inviteeRejectedCallback为

{

"opUserID": "18349115126",

"invitation": {

"inviterUserID": "18666662412",

"inviteeUserIDList": ["18349115126"],

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab",

"roomID": "room_id_111",

"timeout": 1000,

"mediaType": "video",

"sessionType": 2

},

"offlinePushInfo": {}

}

//被邀请者收到:邀请者取消音视频通话

OnInvitationCancelled(invitationCancelledCallback string)

invitationCancelledCallback为

{

"opUserID": "18666662412", 

  "invitation": {

"inviterUserID": "18666662412", 

      "inviteeUserIDList": [

          "18349115126"

], 

"roomID": "room_id_111", 

"timeout": 10, 

"mediaType": "video", 

"platformID": 1, 

      "sessionType": 1

}, 

  "offlinePushInfo": { }

}

//邀请者收到:被邀请者超时未接通

OnInvitationTimeout(invitationTimeoutCallback string)

invitationTimeoutCallback为

{

"opUserID": "18666662412",

"invitation": {

"inviterUserID": "18666662412",

"inviteeUserIDList": ["18349115126"],

"roomID": "room_id_111",

"timeout": 10,

"mediaType": "video",

"platformID": 1,

"sessionType": 1

},

"offlinePushInfo": {}

}

//被邀请者(其他端)收到:比如被邀请者在手机拒接,在pc上会收到此回调

OnInviteeRejectedByOtherDevice(inviteeRejectedCallback string)

//被邀请者(其他端)收到:比如被邀请者在手机接听,在pc上会收到此回调

OnInviteeAcceptedByOtherDevice(inviteeAcceptedCallback string)

音视频邀请invitationInfo结构说明

音视频邀请相关信息

{

"inviterUserID": "18666662412", //邀请者UserID

"inviteeUserIDList": ["18349115126"], //被邀请者UserID列表,如果是单聊只有一个元素

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab", //如果是单聊,为""

"roomID": "room_id_111", //房间ID,必须唯一,可以不设置。

"timeout": 1000, //邀请超时时间(秒)

"mediaType": "video", //video 或者audio

"sessionType": 2 //1为单聊,2为群聊

"platformID":1 //和之前定义一致

}

metadata是参与者信息具体为

ParticipantMetaData

{

GroupInfo //为群通话时有效

GroupMemberInfo //为群通话时有效

PublicUserInfo

}


音视频函数参数及回调说明

SignalingInvite(callback open_im_sdk_callback.Base, operationID string, signalInviteReq string)

说明:邀请个人加入音视频

请求参数:

{

"invitation": {

"inviteeUserIDList": ["18349115126"], //只有一个元素

"roomID": "room_id_111",

"timeout": 1000,

"mediaType": "video",

"sessionType": 1,

"platformID":1

}

"offlinePushInfo":{}

}

回调:成功时,OnSuccess回调

{

"token": "18666662412",

"roomID": "room_id_111",

"liveURL": "wss://"

}

SignalingInviteInGroup(callback open_im_sdk_callback.Base, operationID string, signalInviteInGroupReq string)

说明:邀请群里某些人加入音视频

请求参数

{

"invitation": {

"inviteeUserIDList": ["18349115126"],

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab",

"roomID": "room_id_111",

"timeout": 1000,

"mediaType": "video",

"sessionType": 2

}

}

回调:成功时,OnSuccess回调

{

"token": "18666662412",

"roomID": "room_id_111",

"liveURL": "ws://"

}

SignalingAccept(callback open_im_sdk_callback.Base, operationID string, signalAcceptReq string)

说明:同意某人音视频邀请

请求参数

{

"opUserID": "18349115126", 

    "invitation": {

"inviterUserID": "18666662412", 

        "inviteeUserIDList": [

            "18349115126"

], 

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab", 

"roomID": "room_id_111", 

"timeout": 1000, 

"mediaType": "video", 

        "sessionType": 2

    }

}

回调:成功时,OnSuccess回调

OnSuccess

{

"token": "18349115126", 

"roomID": "room_id_111", 

    "liveURL": ""

}

SignalingReject(callback open_im_sdk_callback.Base, operationID string, signalRejectReq string) 

说明:拒绝某人音视频邀请

请求参数

{

"opUserID": "18349115126", 

    "invitation": {

"inviterUserID": "18666662412", 

        "inviteeUserIDList": [

            "18349115126"

], 

"groupID": "f2e77b9ec33e92298675ad511fdfa6ab", 

"roomID": "room_id_111", 

"timeout": 1000, 

"mediaType": "video", 

        "sessionType": 2

    }

}

回调:成功时,OnSuccess回调

OnSuccess{}

SignalingCancel(callback open_im_sdk_callback.Base, operationID string, signalCancelReq string)

说明:邀请者取消音视频通话

请求参数

{

"opUserID": "18666662412",

"invitation": {

"inviterUserID": "18666662412",

"inviteeUserIDList": ["18349115126"],

"roomID": "room_id_111",

"timeout": 10,

"mediaType": "video",

"platformID": 1,

"sessionType": 1

}

}

回调:成功时,OnSuccess回调

OnSuccess{}

我们的团队

创始团队来自前微信技术团队,我们致力于用开源技术创造服务价值,打造轻量级、高可用的IM架构,开发者只需简单调用 SDK,即可在应用内构建多种即时通讯及实时音视频互动场景。无论是电子政务办公,企业协同办公,或者去中心化的web3应用,OpenIM都是最优选择。对于IM最核心的服务端和客户端SDK,大家可以免费商用,对于带有UI版本的客户端,需要商业授权,对于某些高级功能,也需要商业授权。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容