媒体设备的打开、关闭以及切换

9 篇文章 0 订阅
7 篇文章 0 订阅

媒体设备的打开、关闭以及切换


在项目初期,设备的打开/关闭和切换仅仅是切换了track的enabled属性,比没有释放资源,即原来的设备一直被占用着,显然这十分不友好,因此后面进行了改版。

1. 设备的打开/关闭

1.1 关闭

关闭时,调用track.stop()停止轨道,并将轨道清空

1.2 打开

打开时,重新调用getUserMedia(),用新产生的stream的track替换原来的。

  1. 注意只是替换轨道,不能直接替换stream,因为stream中包含videoTrack和audioTrack,而我们的操作只是针对麦克风或摄像头。
  2. 注意本地和远端都要替换:
    1)替换本地就是直接将本地stream中的track替换就行;
    2)替换远端则同之前的切换摄像头:利用rtpSender.replaceTrack(),无需重新协商替换远端轨道;

到这里还需要进行修改,由于之前打开/关闭仅修改了track.enabled属性,而下面几种情况需要重新调用getUserMedia(),下面以摄像头为例:

  1. 入会时,使用的设备被占(这里其实又涉及到了设备被占后释放问题,见后面的博客),这是摄像头变成关闭状态,在开启的时候就不再是简单的切换track的enabled属性,而是要调用getUserMedia()替换轨道;
  2. 摄像头关闭状态下,切换摄像头设备,然后再打开摄像头。在打开时也要替换轨道;
  3. 正在使用的摄像头被拔出,摄像头关闭,再打开时也要替换轨道;

针对上面的情况,之前的版本中设置了一个isChangeCamera变量,区分仅是切换track的enabled属性,还是要调用getUserMedia()替换轨道。但是改版后,显然不再需要该变量。

之前的版本,是先改变的摄像头的状态,然后才修改的track的enabled属性,如果产生异常,又重新更新摄像头的状态,这个逻辑是不合理的,因此改版后,摄像头的开启应该在getUserMedia调用成功之后,才能更新本地和远端的状态。

而之前的版本,为了处理这个异常情况,设置了一个occupied变量,区分设备是否被占,从而关闭或开启摄像头,改版之后应该也不再需要了

2. 设备的切换

设备的切换同开启摄像头。

但是要注意移动端,经测试,有些移动端的前后置用的是一个资源,在调用getUserMedia()产生新的stream之前,应该释放之前占用的,否则,例如由前置切换成后置,仅仅是切换facingMode,再次调用getUserMedia()时会抛出错误:摄像头被占用,所以干脆移动端和web端分开,移动端在切换时调用getUserMedia()之前就将track关闭掉;web端在getUserMedia()调用成功之后再关,如果提前,由于getUserMedia()的异步,会造成短时间的黑屏。

但是移动端切换和开关在真机测试存在问题,前后置摄像头切换只能切换一次,再切换时getUserMedia()调用时既没有执行成功回调函数,也没有执行异常回调函数,web端模拟时是正常的,暂时还没有找到原因和解决办法???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值