WebRTC - 调用 stop() 后重新启动视频流

Posted

技术标签:

【中文标题】WebRTC - 调用 stop() 后重新启动视频流【英文标题】:WebRTC - Restart Video Stream After Calling stop() 【发布时间】:2021-01-09 19:15:54 【问题描述】:

所以,我正在使用 webRTC 创建本地流(视频和音频),并希望能够停止和重新启动所述流的视频。

在我想停止流的地方,我正在获取本地视频轨道:

     var vidTrack = this.videoEl.srcObject.getTracks().find(track => track.kind == 'video')

然后我在轨道上调用 stop(),它可以工作,并关闭我设备上的摄像头指示灯(这是我想要的)。问题是这似乎是一种单向方法,一旦我调用 stop() 就无法重新启动流。

我只是在轨道对象上切换 enabled 布尔值,这确实会禁用轨道通过,但不会停止在我的设备上显示相机指示灯(我需要它,并且 stop()确实)。

只是想知道是否有人遇到过这个问题/有想法或解决方案来获得我需要的东西。

【问题讨论】:

【参考方案1】:

根据 Dirk V 的回复,这是我为将来可能会看到此问题的任何人最终得出的解决方案:

  if (vidTrack && toggle && vidTrack.readyState && vidTrack.readyState == "ended") 
    let newVideoStreamGrab = await navigator.mediaDevices.getUserMedia(
      video: true
    )
    this.stream.removeTrack(this.stream.getVideoTracks()[0])
    this.stream.addTrack(newVideoStreamGrab.getVideoTracks()[0])
   else 
    vidTrack.stop()
  

【讨论】:

【参考方案2】:

最好的方法是停止后再次向摄像机请求流,因为无法重新启动停止的轨道。

启用标志仅用于允许或禁止轨道渲染帧。所以这意味着它不会影响相机的状态。

当为 true 时,启用表示允许轨道将其实际媒体渲染到输出。当 enabled 设置为 false 时,轨道只生成空帧。 source

【讨论】:

谢谢德克。根据此响应提出了解决方案。那是我认为我必须做的,但希望在赛道的原型上有一个更简单的方法来做到这一点。 很高兴它有帮助。不幸的是,没有其他办法。

以上是关于WebRTC - 调用 stop() 后重新启动视频流的主要内容,如果未能解决你的问题,请参考以下文章

Wowza/WebRTC - 如何在相机翻转时重新协商视频格式

使iis的启动和停止的方法简介

WebRTC PeerConnection 没有启动

重新启动 WPF 故事板

uwsgi服务启动(start)停止(stop)重新装载(reload)

nginx 启动,停止和重新加载配置