欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

可以用WebRTC来做视频直播吗?

程序员文章站 2022-05-04 09:54:59
...
经常看到WebRTC的点对点的视频, 能不能做一个平台,让别人通过WebRTC播放视频直播,让粉丝都可以看见? 有什么方案讲讲?

回复内容:

我所在的项目用这个技术两年多了,先说结论:完全可以!

但是,凡事总有但是,也没那么简单。你以为调用几个Chrome的API就能直播了?too simple

楼上 米小嘉 回答中的猜想是不正确的,WebRTC用的不是插件,是Chrome自带的功能,是原生js的API,也没有什么浏览器自带的插件。
楼上 煎饼果子社长 的方法也不对,WebRTC的API不仅仅是给你获取本地信源的,所谓RTC是real time communication的缩写,自然这套API是带传输功能的。所以获取图像信源之后不应该用websocket发送图像数据,而是直接用WebRTC的通信相关API发送图像和声音(这套API是同时支持图像和声音的)数据。

所以,正确的方法是什么呢?
1、你得有一个实现了WebRTC相关协议的客户端。比如Chrome浏览器。
2、架设一个类似MCU系统的服务器。(不知道MCU是什么?看这:MCU(视频会议系统中心控制设备)

第一步,用你的客户端,比如Chrome浏览器,通过WebRTC相关的媒体API获取图像及声音信源,再用WebRTC中的通信API将图像和声音数据发送到MCU服务器。
第二步,MCU服务器根据你的需求对图像和声音数据进行必要的处理,比如压缩、混音等。
第三步,需要看直播的用户,通过他们的Chrome浏览器,链接上你的MCU服务器,并收取服务器转发来的图像和声音流。

先说步骤一,如果你只是做着玩玩,完全可以直接用Chrome浏览器做你的直播客户端。把摄像头麦克风连上电脑之后,Chrome可以用相关的js的API获取到摄像头和麦克风的数据。缺点就是如果长时间直播,Chrome的稳定性堪忧,我不是吓唬你。我们项目的经验是,chrome这样运行24小时以上内存占用很厉害,而且容易崩溃。

第二步,你可能要问,WebRTC可以直接在浏览器之间P2P地传输流,为什么还要有中转的MCU服务器?因为Chrome的功能很弱,视频的分辨率控制、多路语音的混音都做不了,所以需要MCU参与。最重要的是,Chrome同时给6个客户端发视频流就很消耗资源了,所以你如果有超过10个用户收看的话,Chrome很容易崩溃。

第三步就比较简单了,没什么好说的。

最后最后,还是老话题,兼容性。你可以查一下现在支持的浏览器有款,IE据说支持,但是我们研究了一下好像他用的协议和Chrome不一样,不能互通。firefox和opera情况也不是很理想。

-------------------------2015年11月17日 更新--------------------------
韦易笑 的答案中说“10人以内使用,超过10人就挂了”。从我个人的经验来看,我认为WebRTC并没有那么不堪。我不知道他是用什么样的方案,但是我原来的那个项目,13年做的结果是 1人广播,39人收看,在一台i3 + 4G + Centos6.4 mini的机器上跑MCU,连续运行48小时没有出现问题。CPU的使用率大概在60%左右,内存使用率是多少我记不清了,但是印象中不高,而且比较稳定。能不能支持更多的客户端我们没有尝试,因为当时已经满足我们的需求了。 别迷信 WebRtc,WebRtc只适合小范围(8人以内)音视频会议,不适合做直播:

1. 视频部分:vpx的编码器太弱,专利原因不能用264,做的好的都要自己改264/265代码才行。
2. 音频部分:音频只适合人声编码,对音乐和其他非人声的效果很糟糕。
3. 网络部分:对国内各种奇葩网络适应性太低,网络糟糕点或者人多点就卡。
4. 信号处理:同时用过 GIPS和 WebRTC 进行对比,可以肯定目前开源的代码是GIPS阉割过的。
5. 使用规模:10人以内使用,超过10人就挂了,WebEx方案支持的人数都比 RTC 强。

正确的方法是啥呢?
------------------------- 分割线 -------------------------
让粉丝们来看直播,如果同时粉丝数>10人,那么不关 WebRtc 鸟事,服务器请使用 nginx rtmp-module架设,架设好了用 ffmpeg 命令行来测试播摄像头。主播客户端请使用rtmp进行推流给rtmp-module,粉丝请使用 rtmp / flv + http stream 进行观看,PC-web端的粉丝请使用 Flash NetStream来观看,移动 web端的粉丝请使用 hls / m3u8 来观看。

如果你试验成功要上线了,出现压力了,那么把nginx分层(接入层+交换层),稍微改两行代码,如果资金不足以全国部署服务器,那么把 nginx-rtmp-module 换为 cdn 的标准直播服务,也可以直接调过 nginx,一开始就用 cdn 的直播服务,比如网宿(斗鱼的直播服务提供商)。

这是正道,别走弯路了。
--- 我弄一个手机视频直播应用,刚刚上线,基于WebRTC技术,Mesh tree的网络架构,浏览器之间走P2P Relay, 正在产品迭代中。产品见: yacamera.com 谢 @郭小灿 邀…最近是有参与相关的事,然而也只是初接触。
Talk is cheap, show you some codes:
  • meetecho/janus-gateway · GitHub
  • WebRTC-Experiment/webrtc-broadcasting at master · muaz-khan/WebRTC-Experiment · GitHub, with demo: WebRTC Broadcasting - Muaz Khan
WebRTC 的初衷和优势是 Browser-to-Browser 的,它是 Web 端音视频实时通信。考虑到需要实现 live broadcast,所以 WebRTC 几乎不靠谱,顶多在 broadcaster 和 server 上实现协议栈。server 实现各种 management,比如 room server;如果不在 server 端转发,而是以 broadcaster 为中心进行多个 p2p 连接,那要实现 signaling server, ice server,供 browser 之间连接,而且一个 broadcaster client 能力有限所以支持不了太多连接(基本上是个位数);如果要在 server 端转发(几乎是必需),那要实现 stream server,接收 broadcaster 的 WebRTC 的 rtp 包,流媒体处理(考虑下 gstreamer ?),录制成文件或 rtmp 发送到各个 participants。大系统可以考虑用多台 stream server,cdn + p2p 结合,于是要再实现个 server 搜集和维护各个 peer 的网络信息进行分发调度……其他的 client 端问题无非是网络传输协议和音视频编解码问题,注意统一和兼容。Chrome 的 WebRTC 实现已经很完整,有人提到回声消除,这在 VoiceEngine 里有实现,是用的 NetEQ 算法,源自 GIPS,还有降噪、静音检测等功能。VoiceEngine 十分强大,我想剥出来自己使用(其实不是我想)。 可以的. webrtc就是浏览器直接有实时视频功能, 不需要额外的插件, 但有可能是浏览器的默认插件


----


楼上有人说
" 视频部分:vpx的编码器太弱,专利原因不能用264,做的好的都要自己改264/265代码才行。"
请参见Firefox默认携带的Cisco提供的H264插件, 专利方面是没啥问题的. 这个插件是一个开源项目, 想要改进其性能可以自己去github上面提改进. 呵呵。我来回答这个问题吧
1:视频主播、直播多采用本地软件采集视频和语音(试试OBS),然后RTMP传到服务端,服务端搭个RTMP服务器+web网站就可以实现直播了,再加个聊天室,就是典型的游戏、美女直播系统了。然后再把rtmp流传到CDN去,好!你可以支持到上千人了。但是注意:只能跟直播人文字聊。
2:webrtc是语音与视频的互动,可以互相语音和视频。但是让他做直播?显然不是一个系列的东西了。当然6-8人的视频直播啥的还是可以玩玩的。 可以实现功能,但是效果绝对让你抓瞎,不知道你的应用场景是什么,千万别进坑里去,见过公司都烧钱烧精力结果搞出一个四不像,最后苦苦挣扎资金断流...如果能详细讲一下应用场景,大家可以帮你分析一下的。
贴一个我刚刚写的答案的一部分,希望对你有帮助
--------------------------------------------------分开----------------------------------------------------------------
火热的游戏直播行业,为什么优酷土豆爱奇艺这样视频站没有抓住机会? - 张腾的回答
一,视频直播与视频点播
很多人凭着第一印象,觉得两个名词里面都有视频,就认为两者实现的方式和技术要点是一样的,众多视频点播网站巨头(题主所说的:优酷,土豆,新浪等)都在探索视频直播的道路上吃了大亏,也是因为对两者之间区别的认识不够深刻。

视频点播对于视频本身的要求是:高质量(高码率)和流畅(低卡顿,即加载时间)
视频直播对于视频本身的要求是:清晰,流畅,低延时(无互动,不直播,把延时控制在3秒以内,甚至1秒内意义重大,这一点很多直播平台还都没有认识到)。

注意到区别了?低延时,也就是实时性,差之毫厘谬以千里。
为什么低延时在传统视频点播平台运营商那里会遇到大麻烦,需要讲一下现在所有视频服务的骨架CDN的前世今生,请仔细阅读下面的文字:


随着Internet的迅速发展,用户数量和信息量快速增长,为了从技术上全面解决网络带宽小,用户访问量大,网点分布不均匀等问题,1998年诞生了解决问题的方案,即CDN(内容分发网络)。

CDN技术采用了分布式缓存/复制、负载均衡、流量工程和客户端重定向等技术,设立若干分支节点,尽量将用户请求的内容存储到距离用户“最后一公里”的边缘节点上,在Internet上构筑一个地理上分布的内容分送网络,将信息资源向网络边缘推近,用户可以在 “最近”的位置快速访问到所需的内容,继而提高了终端用户的访问速度和服务质量。


CDN整体框架的顶层设计是为了解决文件的分发和传输问题架设的,系统起初是服务于文件而非实时的流媒体数据。在处理流媒体数据时,现有方案仍沿用了传统的分发原则与模式,无法满足互动直播高质量低延时的要求。



读到这里,你仿佛知道了他们之间的差异。但是,如果你认为CDN是现在主要的技术瓶颈,那你就错了,CDN只是个基础,更纠结的还在下面

二,流媒体传输协议
传输层协议主要讲下面三种

1.TCP

TCP为点对点的协议,虽然能保证了数据传输的可靠性,但是对服务器资源耗费较大,在数据流大的场合难以保证数据流传输的实时性。

2.UDP

UDP为不可靠传输协议,不需要维护连接状态,也不认为每个数据包都必须到达接受端,因此网络负荷比TCP小,传输速度也要比TCP快;但在网络越拥挤时,越有更多的数据包丢失。

3.RTMP

RTMP一个专门为高效传输视频,音频和数据而设计的协议。它通过建立一个二进制TCP连接或者连接HTTP隧道实现实时的视频和声音传输。

现在传统的视频直播都使用的RTMP传输协议,因为不管是UDP还是TCP协议,都不适用于流媒体的实时传输。但是使用RTMP+CDN或云的方案也存在根本性的缺陷。因为不管事RTMP还是CDN, 都源自服务于文件传输的方案,问题主要有以下几个

a:现在做的最好的用RTMP来搭建视频直播方案,其延时也最多能达到5秒左右,实际上,如果要保证视频的流畅(低卡顿)和清晰(高码率),5秒的延时都很难达到,有的方案甚至在7-8秒,直播的很大一部分意义在与互动和实时性,互动对于延时的要求,最佳时间是在2-3内,再长就会体验很差(大家可以自己试一下),而对于很多行业,直播的要求甚至要在半秒以内才有意义,这是现有方案完全无法满足的。

b:对于客户资源的最大程度利用,这一点涉及公司的方案设计,不再详述,有兴趣的可以私信。

c:CDN节点完全属于盲点,直播流浪涌入,一旦某个节点出现波动,只能被动地让用户承担极差用户体验的风险(卡顿,模糊),而对于网络状况本身却处于黑箱状态,不可管,不可控,受制约严重。我相信这一点有相关运维经验的知友都深有感触。

d.e.f....太多字了不写了


我想上面的答案应该能让题主明白,为什么优酷这种巨头做不好“一点微薄的工作“

简而言之

1.运营能力不能代表技术开发水平

2.流媒体实时传输这块领域太窄,不要说优酷,全世界真正深入研究的公司或团体,据我所知,除了我们公司还有一家美国的公司在做,不过他们和我们做的方向还是不一样,这是后话了。

3.互联网节奏太快,很多巨头的想法是,加大投入,缩短研发周期,立竿见影地把流媒体直播这个坑填平,但他们没有想到的是,一个坑后面还有无数个坑,坑里面还有坑,甚至方向可能都错了,赶时间赶进度的初衷反而被这种浮躁的心态给牺牲了。

可以的,http://www.anyrtc.io可以去了解一下,有成熟的视频直播方案,而且可以实现互动直播 天翼rtc就提供这种能力,可以音频聊天,视频会议,对讲,和微直播。 完全可以的,现在已经有很多成熟的范例了,包括行业内的一些SDK也有用到WebRTC中的模块
相关标签: WebRTC