是否可以使用WebRTC从服务器向客户端流式传输视频?

69

在WebRTC中,我经常看到关于点对点实现以及如何从一个客户端获取视频流的内容。那么服务器对客户端的呢?

WebRTC是否可以从服务器向客户端流式传输视频文件? (我正在考虑使用WebRTC Native C++ API创建自己的服务器应用程序,以连接到Chrome或Firefox浏览器客户端应用程序的当前实现。)

好的,如果可能的话,它会比许多当前的视频流服务更快吗?


1
嗨,A-letubby,你真的做到了吗?你能告诉我如何做或分享一些代码吗?谢谢!Philip - Phil
@a-letubby:在Mac OS、Safari和IE浏览器中支持吗? - user2003356
嗨@Philip,我还没有在那方面做任何事情。我计划这样做,但仍然没有太多时间。 - A-letubby
2
据我所知,只有Chrome和Firefox支持WebRTC。 - A-letubby
1
是的,但我们完全可以打赌在不久的将来它们会被更多的浏览器支持。 - Augustin Riedinger
7个回答

55

是的,由于服务器可以是该点对点会话中的一个节点,因此这是可能的。 如果您遵守协议并使用VP8发送SRTP数据包中的视频,浏览器将播放该视频。为了帮助您在其他应用程序或服务器上构建这些组件,您可以查看页面和项目作为指南。

现在,将WebRTC与其他流媒体服务进行比较...这将取决于几个变量,如编解码器或协议。 但是,例如,将WebRTC(SRTP通过UDP使用VP8 Codec)与Flash(RTMP通过TCP使用H264 Codec)进行比较,我会说WebRTC胜出。

  • 播放器将是Flash Player,而不是本地的<video>标签。
  • 传输将是TCP而不是UDP。

但当然,一切都取决于您向客户端发送什么内容。


3
你的答案中第二个链接失效了。否则谢谢! - nelsonic
为什么UDP比TCP更适合视频? - Alex
那个问题在SO上已经被回答了多次。例如,可以参考这个答案:https://dev59.com/-G025IYBdhLWcg3wKCX-#6187510 - nakib
@Alex 因为当 TCP 包死掉时会重新发送,所以不是实时的,请了解更多有关 UDP 和 TCP 的知识。 - nobjta_9x_tq
1
在实践中,您最终将在UDP上重新实现TCP重传。没有用户想要观看缺少画面部分的视频!视频编码使用过去和未来的其他帧引用,因此丢失的数据包可能会使解码器陷入困境,并在最佳情况下导致长时间的伪影传播,就像这张图片一样,请阅读更多有关视频压缩的信息。http://community.avid.com/cfs-filesystemfile.ashx/__key/CommunityServer.Components.UserFiles/00.00.03.89.66/transcode.jpg - Alex
第二个链接现在可能是 https://webrtc.googlesource.com/src/+/master/examples/peerconnection/client/,请参见 https://webrtc.org/native-code/。 - Tino

11

还要查看这个Google小组讨论:https://groups.google.com/forum/#!msg/discuss-webrtc/Pdas21qohck/CCRZTxPx5esJ - Kamo

5
我是一名有用的助手,可以翻译文本。

我最初使用了WebRTC Native C++ to Browser Video Streaming Example,但它无法再与实际的WebRTC Native Code一起构建。

然后我进行了修改,将其合并为一个独立的进程:

  • 管理peerConnection(peerconnection_server
  • 访问Video4Linux捕获(peerconnection_client)。

从浏览器到WebRTC Native C++客户端的流的移除,提供了一种简单的解决方案,可以通过GitHub webrtc-streamer访问可用的Video4Linux设备,以便通过WebRTC浏览器进行访问。

Live Demo


编译webrtc比我预期的要复杂一些,我需要对您的源代码进行一些小的更新(看起来像是webrtc API的更改),但这段代码确实产生了服务器端视频。 谢谢! - mpr

3
我们正在尝试用Webrtc替换我们的服务器软件中的MJPEG,已有一个原型模块,使用Openwebrtc项目的一些组件。这个过程非常麻烦,并且经常出现ICE协商错误(即使在简单的局域网中),但它大部分时间是工作的。我们还使用了Google Webrtc模块进行了原型设计,但它有很多依赖项。我发现使用Openwebrtc模块更容易,因为Google的东西与浏览器上的一般点对点场景紧密相连。我从头编译了以下内容: libnice 0.1.14 gstreamer-sctp-1.0 usrsctp 然后我必须直接与libnice交互一下以收集候选者。还要手动编写SDP文件。但可以控制管道源的数量,使其值得控制。以下是结果管道(一个服务器源连接两个客户端):

resulting webrtc pipeline


0

当然可以,它允许将实时流媒体转换为WebRTC,例如:

OBS/FFmpeg ---RTMP---> Server ---WebRTC--> Chrome/Client

对于这种情况,它允许使用WebRTC播放超低延迟的实时流媒体,约为600~800毫秒。请查看this demo


0

是的,我们开发了一个负载测试工具,用于发布和播放 Ant Media Server。该工具可以广播媒体文件。我们使用了与Ant Media Server相同的本地WebRTC库。


这基本上是一则广告,没有任何源代码或库链接。 - proc
@proc 您可以在 https://resources.antmedia.io/docs/load-testing 找到相关文档。这是存储库链接: https://gitlab.com/Ant-Media/webrtc-test - mgct

0

当然可以。我正在使用本地WebRTC API编写一个程序,它可以作为对等方加入会议并记录视频和音频。

请参见:如何从浏览器流式传输音频到WebRTC本机C++应用程序

而且你绝对可以从本机应用程序中流式传输媒体。

我相信你可以使用dummy_audio_file从本地文件流式传输音频,并找到一种方法来访问视频流式传输进度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接