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 - 如何在相机翻转时重新协商视频格式