Safari不同版本track接口行为差异总结

发布 : 2019-05-18 分类 : 前端,每天学一点 浏览 :

safari 11.0.2

  1. replaceTrack(null)会将整个流杀掉,即流的状态变为inactive;

  2. removeTrack方法只会将trackmuted属性变为truereadyState属性变为ended,而不会将track移除,即流的track属性不为null;

  3. 改变流的方向需要调用RTCRtpTransceiver.prototype.setDirection方法;

  4. 调用removeTrack移除track后,不可以调用addTrack再次将原始track添加回去(例如改变分辨率的场景),否则会报如下错误。推测是由于MediaStream中已经存在同源的track,造成添加失败。解决办法是先调用trackclone方法,再将克隆的track添加进去。

InvalidAccessError: The object does not support the operation or argument.

1
2
let track = stream.getTracks()[0].clone()
pc.addTrack(track, stream)

Webkit bug 174327也提到了该问题,并提供了一种解决方法:先调用replaceTrack(null),再调用removeTrack,该方法可行,但是会报如下错误:

1
2
sender.replaceTrack(null)
pc.removeTrack(sender)

OperationError: CreateOffer called with invalid session options

safari 12.1

  1. 存在与11.0.2同样的问题4,而且removeTrack后第一次调用的addTrack无效,再次调用addTrack才可添加流成功;

  2. removeTrack会将RTCRtpSender中的track置为null,虽然调用addTrack也能成功,getSenderstrack不再为null,但是本地sdp中却是没有ssrc字段的,因此想要添加流必须先克隆再添加,而且addTrack需要调用两次才能生效,原因未知,造成的影响就是getSenders长度会加1。

  3. replaceTrack(null)行为一致,但是使用replaceTrack移除流再添加流会失败,说出来你可能不信,replaceTrack也需要调用两次才能成功添加流,而且使用replaceTrack添加流的时候会使得getSender中产生两个相同的sender,造成getSender长度莫名+1。第一次会报如下错误:

Unhandled Promise Rejection: OperationError: CreateOffer called with invalid session options

tips

safari中是没有addStreamremoveStream方法的,adapter中还是通过addTrackremoveTrack进行模拟。

demo地址:>>>点我进入

本文作者 : 冰比冰水冰
原文链接 : http://iceiceice.top/2019/05/18/safari_webrtc_api/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹