视频不流
Video not streaming
我为大量主播编写了一个简单的网络应用程序。流很稳定,但 audio/video 没有显示。
也许你知道原因。
见https://github.com/enexusde/Maven-Many-Videomeeting-RTC-OnlineServlet3.0
要启动应用程序,只需在控制台中写入 mvn
,所有目标均使用 Maven defaultGoal。
然后启动两个具有 url http://localhost:8080/vc/ 的浏览器选项卡。
此致
我已经在 GitHub 上分叉并修改了您的项目。可以找到工作代码和设置说明 here.
这是打开 4 个选项卡时的样子。您可以在右上角看到本地会话 ID,并在每个远程视频上看到相应的会话 ID。我使用 VCam 进行调试。这就是为什么试用文本:
有一些问题需要解决:
- 主要问题是 the comparison
if (y != "complete")
. You are comparing event object with "complete" string. You end up sending offer SDP without any ICE candidate. Using if (self.peerConn.iceGatheringState === "complete")
ref 修复了部分问题。通过此更改,接收方可以看到发送方的视频。
- 从接收方创建答案并发回 SDP immediately。 ICE 候选集合在您调用
createAnswer()
或 createOffer()
后开始。所以你发送的 SDP 没有任何 ICE 候选人。
解决此问题后,发件人端没有 onAddStream
和 streamEventsChangedHandler
处理程序。因此发件人永远不会将接收到的流设置为相应的 <video>
元素。
- RTCPeerConnection 能够发送 和接收 video/audio 具有相同连接对象的流。您也可以在发件人上设置
setRemoteDescription()
。您不必维护单独的 Sender 和 Receiver 连接对象。这里的主要改进可能是您将 Sender 和 Receiver classes 合并为一个 Connection class。这样您就可以在每个参与者端为 n 个参与者创建 n-1 个连接。在服务器上你只需要跟踪 n 个连接而不是 n*(n-1)。
RTCPeerConnection.onaddstream
是 deprecated. Use RTCPeerConnection.ontrack
property
- 通过安全通道 (HTTPS) 提供网页。因为浏览器不会让您的网页通过不安全的 (HTTP) 访问媒体硬件。ref。 Localhost(127.0.0.1) 异常。
您可以 configure tomcat7-maven-plugin
in pom.xml to serve pages on HTTPs. Steps to setup HTTPs are in the README.md 文件。
- 你需要更多timeout delay。 2秒非常少。由于这种直接的 P2P 连接,客户端之间的流传输延迟可能非常低,而连接到您的服务器的延迟很高。因此,如果他们无法连接到服务器并不意味着他们停止了通信。一旦您在客户端之间建立连接,服务器的角色就结束了,直到它们明确注销。
- 由于 Chrome autoplay policy you can't start playing other's video directly. So had to add an overly 在页面上强制用户交互。一旦您实施了登录,这将不是问题。
- 在创建 Room 对象之前获取本地媒体流,最好是在页面加载之后和用户通过覆盖之前立即获取。如果用户延迟提供设备访问权限,您的 Room 对象将已经完成与其他对等方的所有连接过程,而无需共享任何本地 audio/video 流。如果您稍后处理它,则必须再次将 tracks/streams 添加到所有连接。
- 进行了一些重组。在服务器端,我从 MeetSessions.java to separate files. It was getting hard to understand the code. Something with the index.html 移动了 public 内部 classes。
我已经使用 Windows PC、Android phone 和平板电脑测试了 LAN/Wi-Fi 中的代码。如果您在 public 域中托管您的服务器,您可能需要 TURN server as well for these reasons.
我为大量主播编写了一个简单的网络应用程序。流很稳定,但 audio/video 没有显示。
也许你知道原因。
见https://github.com/enexusde/Maven-Many-Videomeeting-RTC-OnlineServlet3.0
要启动应用程序,只需在控制台中写入 mvn
,所有目标均使用 Maven defaultGoal。
然后启动两个具有 url http://localhost:8080/vc/ 的浏览器选项卡。
此致
我已经在 GitHub 上分叉并修改了您的项目。可以找到工作代码和设置说明 here.
这是打开 4 个选项卡时的样子。您可以在右上角看到本地会话 ID,并在每个远程视频上看到相应的会话 ID。我使用 VCam 进行调试。这就是为什么试用文本:
有一些问题需要解决:
- 主要问题是 the comparison
if (y != "complete")
. You are comparing event object with "complete" string. You end up sending offer SDP without any ICE candidate. Usingif (self.peerConn.iceGatheringState === "complete")
ref 修复了部分问题。通过此更改,接收方可以看到发送方的视频。 - 从接收方创建答案并发回 SDP immediately。 ICE 候选集合在您调用
createAnswer()
或createOffer()
后开始。所以你发送的 SDP 没有任何 ICE 候选人。
解决此问题后,发件人端没有onAddStream
和streamEventsChangedHandler
处理程序。因此发件人永远不会将接收到的流设置为相应的<video>
元素。 - RTCPeerConnection 能够发送 和接收 video/audio 具有相同连接对象的流。您也可以在发件人上设置
setRemoteDescription()
。您不必维护单独的 Sender 和 Receiver 连接对象。这里的主要改进可能是您将 Sender 和 Receiver classes 合并为一个 Connection class。这样您就可以在每个参与者端为 n 个参与者创建 n-1 个连接。在服务器上你只需要跟踪 n 个连接而不是 n*(n-1)。 RTCPeerConnection.onaddstream
是 deprecated. UseRTCPeerConnection.ontrack
property- 通过安全通道 (HTTPS) 提供网页。因为浏览器不会让您的网页通过不安全的 (HTTP) 访问媒体硬件。ref。 Localhost(127.0.0.1) 异常。
您可以 configuretomcat7-maven-plugin
in pom.xml to serve pages on HTTPs. Steps to setup HTTPs are in the README.md 文件。 - 你需要更多timeout delay。 2秒非常少。由于这种直接的 P2P 连接,客户端之间的流传输延迟可能非常低,而连接到您的服务器的延迟很高。因此,如果他们无法连接到服务器并不意味着他们停止了通信。一旦您在客户端之间建立连接,服务器的角色就结束了,直到它们明确注销。
- 由于 Chrome autoplay policy you can't start playing other's video directly. So had to add an overly 在页面上强制用户交互。一旦您实施了登录,这将不是问题。
- 在创建 Room 对象之前获取本地媒体流,最好是在页面加载之后和用户通过覆盖之前立即获取。如果用户延迟提供设备访问权限,您的 Room 对象将已经完成与其他对等方的所有连接过程,而无需共享任何本地 audio/video 流。如果您稍后处理它,则必须再次将 tracks/streams 添加到所有连接。
- 进行了一些重组。在服务器端,我从 MeetSessions.java to separate files. It was getting hard to understand the code. Something with the index.html 移动了 public 内部 classes。
我已经使用 Windows PC、Android phone 和平板电脑测试了 LAN/Wi-Fi 中的代码。如果您在 public 域中托管您的服务器,您可能需要 TURN server as well for these reasons.