WebRTC中Chrome与Firefox的Track ID差异问题求解决方案
针对你遇到的Firefox修改MediaStreamTrack ID的问题,这里有几个可行的解决思路,适配你用WebRTC原生JNI封装的场景:
给Track绑定自定义唯一标识,替代原生ID
在获取初始MediaStreamTrack(还未添加到对等连接轨道前)时,给它附加一个自定义的唯一ID(比如用UUID生成),示例代码:const originalTrack = await navigator.mediaDevices.getUserMedia({video: true}).then(stream => stream.getTracks()[0]); originalTrack.myCustomId = crypto.randomUUID(); // 自定义唯一标识之后用Map维护这个
myCustomId与RTCRtpSender的对应关系,发送API数据包时用myCustomId代替原生Track ID。JNI层只需通过这个自定义ID找到对应的Sender即可,不受Firefox修改原生Track ID的影响。维护RTCRtpSender与初始Track的映射关系
在调用pc.addTrack()获取RTCRtpSender时,立即将Sender与未被修改ID的初始Track绑定,示例代码:const sender = pc.addTrack(originalTrack, stream); sender.originalTrackId = originalTrack.id; // 存储初始Track ID后续即使Firefox修改了Track的ID,你依然可以通过Sender的
originalTrackId字段关联最初的标识,发送API数据包时用这个存储的初始ID,JNI层直接读取Sender的自定义属性即可完成对应。通过RTCRtpSender的track属性反向匹配
在JS层维护{customId: sender}的映射表,当Firefox修改Track ID后,通过sender.track拿到最新的Track对象,再结合映射表找到对应的Sender,确保关联关系不中断。这个方案完全不依赖原生Track ID,靠自定义标识与Sender的绑定实现关联。
Firefox修改Track ID是内部处理逻辑与Chromium的差异导致的,只要你放弃依赖原生Track ID作为唯一标识,转而使用自定义绑定关系,就能避开这个问题。
内容的提问来源于stack exchange,提问作者Jan Heil

