Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 来自网络浏览器的Youtube/Facebook实时流是如何工作的_Javascript_Html_Webrtc - Fatal编程技术网

Javascript 来自网络浏览器的Youtube/Facebook实时流是如何工作的

Javascript 来自网络浏览器的Youtube/Facebook实时流是如何工作的,javascript,html,webrtc,Javascript,Html,Webrtc,我正在寻找一种使用web浏览器实现视频编码器的方法。Youtube和Facebook已经允许你直接从网络浏览器进行直播。我想知道他们是怎么做到的 我研究了几种解决方案: 使用web套接字:使用web浏览器对视频进行编码(使用mediarecorder api),并将编码后的视频推送到服务器进行广播 使用WebRTC:web浏览器作为WebRTC对等方,另一台服务器作为另一端,以接收流并使用其他方式(rtmp、hls)重新广播(转码) 这些家伙(YouTube、Facebook)还使用其他技术

我正在寻找一种使用web浏览器实现视频编码器的方法。Youtube和Facebook已经允许你直接从网络浏览器进行直播。我想知道他们是怎么做到的

我研究了几种解决方案:

  • 使用web套接字:使用web浏览器对视频进行编码(使用mediarecorder api),并将编码后的视频推送到服务器进行广播
  • 使用WebRTC:web浏览器作为WebRTC对等方,另一台服务器作为另一端,以接收流并使用其他方式(rtmp、hls)重新广播(转码)
这些家伙(YouTube、Facebook)还使用其他技术来实现这一点吗?或者他们也使用这些东西


谢谢

正确,您找到了两种方法。(请注意,对于MediaRecorder方法,您可以使用任何其他方法将数据获取到服务器。Web套接字是一种方法……常规HTTP段输出也是一种方法。或者,您甚至可以使用WebRTC连接到服务器的数据通道。)

几乎每个人都使用WebRTC方法,因为有一些很好的内置好处:

  • 低延迟(以牺牲某些质量为代价)
  • 动态比特率
  • 在客户端上进行了很好的优化
  • 如果没有足够的系统资源以更高的帧大小继续编码,则能够自动缩放输出
WebRTC方法的缺点:

  • 用于维护服务器端的极其复杂的堆栈
  • 质量较低(由于强调低延迟,但您可以通过自己摆弄SDP来调整)
<>如果你去WebRTC路线,考虑GStuffER。如果您想使用Web套接字路由,我已经编写了一个代理来接收数据并将其发送到FFmpeg以复制到RTMP。你可以在这里找到它:

WebRTCHacks有一篇“youtube如何使用webrtc”的帖子,其中分析了它们实现的一些技术细节


此外,他们的一名工程师在波士顿WebRTC上做了一次演讲,描述了系统,我认为websocket是使用的,WebRTC是用于点对点直接的,但上次我检查时,它不能保证,所以您需要设置名为TURN的中间服务器?服务器。就像接力一样。看看discord websocketscaling@MuhammadUmerWebRTC可以很好地用于浏览器和服务器之间的连接。服务器只是此场景中的“对等方”之一。对服务器是,但如果其他用户落后于NAT,则对其他用户不是。服务器可以正常工作,因为你们可以像在websocket中一样提供连接的url。我在webrtc中做了一个项目,这是有史以来最困难的事情。即使您接受了所有这些与直觉相反的东西并加入进来,文档在MDN本身上是错误的,因为根据规范,它们是正确的,但是浏览器实现的内容是不正确的。@MuhammadUmer这里更大的问题是在服务器端接收视频数据时,可以对其进行操作或重新编码以进行分发。。我以前做过的两种方法是使用gstreamer,或者使用实际的浏览器引擎服务器端。我们仍然缺少一个神奇的工具,可以是一个合适的WebRTC对等和转储帧,甚至媒体比特流。感谢Brad,但是从视频编码方面来说,WebRTC也使用了与MediaRecorder API相同的机制,对吗?说,不管是WebRTC还是Web套接字——也就是说,不管传输机制如何,这两个系统之间的编码任务都是相同的,对吧?@nhong Nope!这很好,但它们是两个不相关的、非常不同的东西,常常是不相连的。他们甚至不总是使用相同的编解码器。(例如,在Firefox中,您可以使用H.264的基线配置文件,但上次我检查它时,您根本不能在MediaRecorder中使用H.264!我提交了一份错误报告…不确定是否有优先权。)记住,WebRTC堆栈针对延迟进行了优化,而MediaRecorder编码则没有。@nhong如果所有这些参数都暴露在MediaRecorder接口上,那么我们就可以选择自己的延迟目标,并根据需要动态调整大小,但这不是它的构建方式,也不是规范的编写方式。非常感谢Philipp,这些信息非常有用。