WebRTC视频流停止共享

6
我使用peerjs创建了基于webrtc的视频聊天。使用控件创建本地和远程视频元素:
本地: 'video id=[local_peer_id] autoplay="true" controls="true">'
远程: 'video id=[remote_peer_id] autoplay="true" controls="true">'
现在,如果本地用户静音,则远程用户将听不到任何声音,这个功能很完美。
问题出现在视频上。如果本地用户暂停自己的视频,则他可以看到视频已暂停,但远程用户仍然可以看到他的视频直播。
另一方面,如果远程用户暂停其视频,则本地用户仍然可以看到他的视频直播。
有人能告诉我该怎么做才能实时“暂停”和“恢复”视频,以使两个用户都生效吗?

1
你是否已将停止和暂停事件连接到WebRTC调用停止共享视频? - Giuseppe Pes
不,我只是在 div 元素中添加了本地和远程对等视频元素。我刚刚尝试了默认控件中的暂停和播放按钮。你能否告诉我更多细节,或者我需要做什么? - new developer
3个回答

14

您需要了解HTML标签和WebRTC流之间的区别...

您可以运行流,而无需将其附加到任何HTML标签上,媒体仍然可以通过每个对等方发送和接收。因此,每个对等方都可以将流连接到音频/视频标签,并且该标签仅充当播放器,用于播放已经运行的流。

因此,如果您将HTML标签静音,您只会使播放器静音,而不是流。如果您希望让其他对等方产生影响,则需要在流或对等连接中进行操作。

特别是,要静音和恢复音频或视频,您需要在媒体流中切换媒体轨道。

    // create a button to toggle video 
    var button = document.createElement("button");
    button.appendChild(document.createTextNode("Toggle Hold"));

    button.onclick = function(){
        mediaStream.getVideoTracks()[0].enabled =
         !(mediaStream.getVideoTracks()[0].enabled);
    }

要暂停/恢复音频,请改用getAudioTracks()。


非常感谢!'mediaStream.getVideoTracks()[0].enabled = !(mediaStream.getVideoTracks()[0].enabled);' 完美地解决了问题。我有一个问题,如何恢复视频流?我需要再次发起新的呼叫吗?还是可以通过 getVideoTracks 做些什么? - new developer
你只需要重新启用视频轨道即可。 - nakib
是的,已经生效了。mediaStream.getVideoTracks()[0].enabled = "true"。谢谢! - new developer
2
根据MDN文档,enabled是只读的:https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/enabled 现在我该如何暂停和恢复一个轨道? - waldgeist
这个解决方案有效!但是,当视频被禁用时,我的网络摄像头仍然开着。 - Amarnath R

5

调用 mediaStream.stop() 将会停止相机
其中 mediaStream 是你在调用 getUserMedia 时获取的流

这里有一个可行的示例


@igorpavlov仍然在Chrome 46.0.2490.80 m上工作。 - Ron Harlev
3
已经过时,在47版本中它不起作用了。https://dev59.com/DFsW5IYBdhLWcg3wdW-T - igorpavlov

1

mediaStream.getAudioTracks()[0].stop();
mediaStream.getVideoTracks()[0].stop();

希望这在新标准下能够正常工作。在我的应用程序中运行良好。


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