如何开发一款会议室(音视频)产品?好像有点难

5 小时 53 分钟前
 dnjat

上头交给年后任务,开发一款用来在线教育的音视频软件,先让我先研究一下,然后规划下流程方案和技术选型,主导这个软件的开发(我会 c++,java ,另外两个会 java )。

本人无音视频开发经验也无理论知识,完全从头开始研发。

为什么不用市面上已有产品?因为要交钱,老板希望有自己的产品,方便日后扩展,升级,满足他的控制欲,为称霸扫平道路。

👑希望能得到音视频大佬们的指点👑。

软件需求:

1 、桌面端界面使用 QT ,移动端界面使用 Flutter 或原生。

2 、业务库统一用 C++实现,多端界面端统一调用业务库(粗略了解到过程中还有交叉编译之类的,不知道是不是很复杂)。

下面是我这两天的查阅,拼湊出的一个简略框架和流程:

大体框架:

1 、桌面端界面使用 QT ,移动端界面使用 Flutter 或原生。

2 、业务库统一用 C++实现,多端界面端统一调用业务库(粗略了解到过程中还有交叉编译之类的,不知道是不是很复杂)。

大体流程:

1 、通过 gRPC 传输信令,建立 WebRTC 点对点连接(这里打算直接用 P2P 建立连接,涉及到 NAT 穿透,如果穿不透,使用 TURN 做中继,用中继后所有流量都得走服务器,人一多,对服务器带宽是个挑战,基本一个 5M 带宽,最多支持 5 个一对一,那得多少带宽才能带得动)。

2 、教师通过系统 API 捕获屏幕,摄像头采集,麦克风采集,通过 ffmpeg 处理后,用 WebRTC 传输。

3 、学生端直接使用 WebRTC 显示。

使用 WebRTC:

使用 WebRTC 比较方便,有网络自适应。但好像只能在浏览器中使用。

WebRTC 也有 native 库(原生 native 库,metartc ),直接在 C++调用,不知道坑多不多。

不使用 WebRTC:

采用 RTMP/RTSP 传输,ffmpeg 解码后,用 OpenSL ,OpenGL 之类自己做渲染。

疑问:

1 、使用 WebRTC 方便 还是 用 RTMP/RTSP 传输后自己解码显示?

2 、如何避免/减少点对点流量对服务器造成的带宽压力?

这中间有的地方可能理解得不对🐞,希望得到大佬们的批评指点🌻。如果有不错的学习资源,帮忙推荐一下🎁。

478 次点击
所在节点    程序员
32 条回复
iOCZS
5 小时 36 分钟前
降噪、回声消除这些你们自己就搞不定的。。。
leonlx
5 小时 30 分钟前
为啥用 Qt ,你们很熟悉其技术栈吗
dnjat
5 小时 29 分钟前
@iOCZS 自己写肯定是不会写了,看能不能网上扣个算法下来,或是用 WebRTC 自带的处理。
好像还有音视频同步,也挻难的。
dnjat
5 小时 27 分钟前
@leonlx 会 c++,了解点 QT ,觉得这个会好下手点。查了下资料,看用 QT 来做音视频也挺多的,方便跨端。
iOCZS
5 小时 26 分钟前
@dnjat WebRTC 是有处理的,看看有没有现成的开源,直接跑起来看看效果如何
iOCZS
5 小时 22 分钟前
2 这个问题就涉及架构问题,综合来看,多方通信架构无外乎以下三种方案。

Mesh 方案,即多个终端之间两两进行连接,形成一个网状结构。比如 A 、B 、C 三个终端进行多对多通信,当 A 想要共享媒体(比如音频、视频)时,它需要分别向 B 和 C 发送数据。同样的道理,B 想要共享媒体,就需要分别向 A 、C 发送数据,依次类推。这种方案对各终端的带宽要求比较高。
MCU ( Multipoint Conferencing Unit )方案,该方案由一个服务器和多个终端组成一个星形结构。各终端将自己要共享的音视频流发送给服务器,服务器端会将在同一个房间中的所有终端的音视频流进行混合,最终生成一个混合后的音视频流再发给各个终端,这样各终端就可以看到 / 听到其他终端的音视频了。实际上服务器端就是一个音视频混合器,这种方案服务器的压力会非常大。
SFU ( Selective Forwarding Unit )方案,该方案也是由一个服务器和多个终端组成,但与 MCU 不同的是,SFU 不对音视频进行混流,收到某个终端共享的音视频流后,就直接将该音视频流转发给房间内的其他终端。它实际上就是一个音视频路由转发器。

我估计你们会采用 SFU 架构。
dnjat
5 小时 15 分钟前
@iOCZS @iOCZS 软件需求贴错了,不能修改了。
软件需求:
一对一的模式,一方开启投屏(教师端),另一方进行观看(学生端),支持语音对话(后期可能会扩展荧光笔这类标记功能)。
支持多端,桌面端(windows,mac),手机平板端(andorid,ios)。每个端都支持教师与学生。

也想过一对一也用 SFU 架构,但想着如果有 200 组同时上课,像一个 5M 服务器,最多就 5 组的并发量。这个带宽是个压力。想着 NAT 穿透,两个不同的局域网通过公网点对点,基本不可能,只能走服务器了。
gaobh
5 小时 5 分钟前
做这玩意太麻烦了,不知道给了你们多少钱投入,带宽,延时,波动,分辨率,帧率,视频采集,摄像头采集,扬声器,麦克风采集,解码器,录制,传输,代理设置,账户,存储,热活冷备……每一个都够喝一壶的
dnjat
5 小时 1 分钟前
@gaobh 有什么简便的方案推荐吗,是挺难的,很多资料说说没个三,五年经验,很难开发出来。 只要一对一投屏🤣
wentx
4 小时 52 分钟前
是不是可以基于 Livekit 去做一些修改
foxhunt
4 小时 51 分钟前
@iOCZS 确实是行家,当年我们搞视频会议,降噪回音这块还专门找的人来进行的处理,但效果也不是特别理想

当时为了降低主讲端的压力,采用的是 SFU 架构,加 N 个中转服务器对数据进行转发
GeekGao
4 小时 48 分钟前
直接用声网 sdk 吧,别折腾,在不依赖于其他 sdk 的情况下你们大概率无法在 1 年内搞定的。
zhangyb123
4 小时 45 分钟前
这种可以直接研究开源的产品,比如 github 上的 Telegram
dnjat
4 小时 36 分钟前
@wentx 不错的开源项目,我先去关注下,看适不适合二次整合。
dnjat
4 小时 35 分钟前
@foxhunt 如果是一对一视频会议,也走服务器做数据转发,服务器的带宽是不是会要求很大
iOCZS
4 小时 34 分钟前
@dnjat 音视频的成本就是高的,不过你们这种一对一的,其实还是算简单的。但是正如你说的,如果需要 NAT 穿透,流量还是要走服务器,无法 p2p 。
dnjat
4 小时 31 分钟前
@GeekGao 这个领域是挺难,之前调研了三方 sdk ,就是要钱,老板想着自己开发一个吧。只要一对一投屏(一方投屏,一方观看),自己研发是不太可能,看不能借助开源项目,整合个最小可用的框架出来不。
dnjat
4 小时 25 分钟前
@iOCZS 如果流量走服务器,一台服务器并发不了几个一对一,走服务器反而适合一对多的这种。
dnjat
4 小时 20 分钟前
@zhangyb123 看了下 Telegram ,带有这样的功能。有源码,是个好的研究方向,太谢谢了。
foxhunt
4 小时 13 分钟前
@dnjat 占多少带宽,可以算出来的
看一组教学有几路视频几个屏幕共享,根据码流算下就行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1107182

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX