mediasoup - PayloadTypes之间错过匹配

时间:2017-12-05 08:38:23

标签: webrtc rtsp rtp sdp opus

我正在尝试使用mediasoup转发带有room.createRtpStreamer

的RTP流

我的问题是我从producer.rtpParameters.codecs[i].payloadType获得的有效载荷类型(对于OPUS)是111,
而我得到的实际RTP数据包是100(见Wireshark)

我尝试在服务器的配置中设置preferredPayloadType,但似乎没有任何区别。

注意: 如果我将100硬编码为OPUS流的有效载荷类型,我可以使用FFPlay查看/收听流

我正在使用Chrome 55(最新版)和mediasoup 2.0.5(最新版)

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

Producer具有客户端(浏览器)决定的RTP参数,因此OPUS的PT为111(Chrome生成的默认值)。

但是,一旦在mediasoup服务器中,与Consumers关联的Producer使用在房间创建期间给出的RTP参数。因此,如果提供给room = new server.Room(codecs) [1]的编解码器具有preferredPayloadType字段,则将在Consumers内使用(否则它将由服务器随机选择)。

因此,当您致电room.createRtpStreamer()时,您提供了Producer,而生成的RtpStreamer [2]会有相关联的ConsumerPlainRtpTransport。因此,您应该阅读rtpStreamer.consumer.rtpParameters而非producer的内容。

答案 1 :(得分:1)

您应该查看呼叫建立消息的SDP,并检查OPUS有效负载是否获得111或100。 从那里你可以决定哪个部分有bug(Chrome或mediasoup)。 在呼叫建立消息(发起呼叫)中检查OPUS代码的有效负载。 被叫方如果接受OPUS,则应使用相同的有效负载号进行响应,然后双方应在RTP数据包中使用相同的有效负载号。

答案 2 :(得分:0)

所以我发现producer.rtpParameters.codecs[i].payloadType上的有效负载是原始有效负载,room.createRtpStreamer更改了有效负载类型。

完成以下操作以解决问题

// get the payload (type) from the room.rtpCapabilities.codecs.preferredPayloadType for the specific codec
let payload = this.room.rtpCapabilities.codecs.find((c)=>{
    return c.name === producer.rtpParameters.codecs[i].name;
}).preferredPayloadType;