我正在尝试使用mediasoup转发带有room.createRtpStreamer
我的问题是我从producer.rtpParameters.codecs[i].payloadType
获得的有效载荷类型(对于OPUS)是111,
而我得到的实际RTP数据包是100(见Wireshark)
我尝试在服务器的配置中设置preferredPayloadType
,但似乎没有任何区别。
注意: 如果我将100硬编码为OPUS流的有效载荷类型,我可以使用FFPlay查看/收听流
我正在使用Chrome 55(最新版)和mediasoup 2.0.5(最新版)
任何帮助将不胜感激。
答案 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]会有相关联的Consumer
和PlainRtpTransport
。因此,您应该阅读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;