WebRTC场景下如何区分屏幕共享轨道与摄像头视频轨道?
可行解决方案
方案1:RTP扩展头携带自定义标识(标准推荐,兼容性最优)
这是WebRTC规范内支持的跨端传递轨道元数据的方案,不受轨道重创建、transceiver重建的影响:
- 两端先约定统一的RTP扩展头唯一标识URN,例如自定义为
urn:yourcompany:params:rtp-hdrext:video-source-type(无需真实可访问,仅需两端规则一致) - 本地创建轨道后,给对应
RTCRtpSender配置扩展头赋值:摄像头轨道传值1,屏幕共享轨道传值2 - 远端触发
ontrack事件后,从对应RTCRtpReceiver的入站RTP包扩展头中读取预定义的标识值,即可直接判定轨道类型
方案2:MediaStream关联标识传递(实现最简单)
你提到无法给MediaStreamTrack加自定义属性,但自定义创建的MediaStream实例的自定义属性可以随轨道同步到远端:
- 本地创建完摄像头/屏幕共享轨道后,手动实例化一个新的
MediaStream对象,将轨道加入该流,同时给流添加自定义属性标记类型:stream.sourceType = 'camera'或stream.sourceType = 'screen' - 调用
RTCPeerConnection.addTrack()方法时,将自定义流作为第二个参数传入:pc.addTrack(videoTrack, customMarkedStream) - 远端
ontrack事件回调的streams字段会携带你本地传入的标记流,直接读取streams[0].sourceType即可区分轨道类型
实测Chrome 90+、Safari 15+、Edge 90+均支持该特性,可覆盖绝大多数用户场景。
方案3:信令层同步SSRC映射表(兼容性兜底)
如果前两种方案存在特殊设备兼容性问题,可以通过信令通道同步映射关系:
- 本地每次新增视频轨道并完成sender创建后,读取当前轨道对应sender的SSRC:
const ssrc = sender.getParameters().encodings[0].ssrc - 将
ssrc和对应轨道类型(camera/screen)通过信令通道发送给远端,远端维护一份SSRC和轨道类型的映射表 - 远端触发
ontrack事件时,读取对应receiver的SSRC,查询本地映射表即可得到轨道类型 - 每次轨道重创建(如重开摄像头、重新共享屏幕)时,仅需同步一次新的SSRC映射关系即可
内容的提问来源于stack exchange,提问作者Kanhaiya
相关产品推荐
相关产品推荐

