我正在尝试使用以下 Gstreamer 命令将来自 RTMP 源的流注入 Mediasoup:
gst-launch-1.0 -v \
rtpbin name=rtpbin \
rtmpsrc location=${RTMP_URL} \
! flvdemux name=demux \
demux.video \
! queue \
! h264parse \
! decodebin \
! videoconvert \
! vp8enc target-bitrate=2000000 deadline=1 cpu-used=-5 \
! rtpvp8pay pt=102 ssrc=22222222 picture-id-mode=2 \
! rtprtxqueue max-size-time=3000 max-size-packets=0 requests=2000 \
! rtpbin.send_rtp_sink_0 \
rtpbin.send_rtp_src_0 ! udpsink host=${listenIp} port=${videoRtpPort} \
rtpbin.send_rtcp_src_0 ! udpsink host=${listenIp} port=${videoRtcpPort} sync=false async=false \
udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \
demux.audio \
! queue \
! decodebin \
! audioconvert \
! audioresample ! audio/x-raw, rate=24000 \
! opusenc \
! rtpopuspay pt=101 ssrc=11111111 \
! rtprtxqueue max-size-time=3000 max-size-packets=0 requests=2000 \
! rtpbin.send_rtp_sink_1 \
rtpbin.send_rtp_src_1 ! udpsink host=${listenIp} port=${audioRtpPort} \
rtpbin.send_rtcp_src_1 ! udpsink host=${listenIp} port=${audioRtcpPort} sync=false async=false \
udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1
我在生产者中启用 RTCP 反馈,如下所示:
this._injectVideoProducer = await this._injectVideoTransport.produce({
kind : 'video',
rtpParameters : {
codecs : [
{
mimeType : 'video/vp8',
clockRate : 90000,
payloadType : 102,
rtcpFeedback : [
{ type: 'nack' },
{ type: 'nack', parameter: 'pli' },
{ type: 'cm', parameter: 'fir' },
{ type: 'goog-remb' }
]
}
],
encodings : [ { ssrc: 22222222 } ]
}
});
结果是视频随机冻结并在几秒钟后再次播放。我相信这是由于 RTP 数据包丢失。这是 pruducer 统计数据的快照:
Inject-video-producer stats: [
{
"bitrate":2132493,
"byteCount":151285009,
"firCount":0,
"fractionLost":0,
"jitter":0,
"kind":"video",
"mimeType":"video/VP8",
"nackCount":160,
"nackPacketCount":1700,
"packetCount":116907,
"packetsDiscarded":0,
"packetsLost":170,
"packetsRepaired":0,
"packetsRetransmitted":0,
"pliCount":7,
"score":10,
"ssrc":22222222,
"timestamp":796306772,
"type":"inbound-rtp"
}]
在这里,当我在视频中冻结时, nackCount
and 会增加,但始终保持为零。nackPacketCount
packetsRetransmitted
Mediasoup 是否正确向 Gstreamer 发送重传请求?还是重传机制不正常?还是问题出在 Gstreamer 方面?这是来自 Gstreamer 输出日志的快照:
/GstPipeline:pipeline0/GstRtpBin:rtpbin/GstRtpSession:rtpsession1:
stats = application/x-rtp-session-stats, rtx-drop-count=(uint)0,
sent-nack-count=(uint)0, recv-nack-count=(uint)0,
source-stats=(GValueArray)< "application/x-rtp-source-stats\,
\ ssrc\=\(uint\)11111111\,\ internal\=\(boolean\)true\,\ validated\=\(boolean\)true\,
\ received-bye\=\(boolean\)false\,\ is-csrc\=\(boolean\)false\,
\ is-sender\=\(boolean\)true\,\ seqnum-base\=\(int\)29231\,\ clock-rate\=\(int\)48000\,
\ octets-sent\=\(guint64\)22460160\,\ packets-sent\=\(guint64\)140376\,
\ octets-received\=\(guint64\)22460160\,\ packets-received\=\(guint64\)140376\,
\ bitrate\=\(guint64\)64000\,\ packets-lost\=\(int\)-140376\,\ jitter\=\(uint\)0\,
\ sent-pli-count\=\(uint\)0\,\ recv-pli-count\=\(uint\)0\,\ sent-fir-count\=\(uint\)0\,
\ recv-fir-count\=\(uint\)0\,\ sent-nack-count\=\(uint\)0\,\ recv-nack-count\=\(uint\)0\,
\ have-sr\=\(boolean\)true\,\ sr-ntptime\=\(guint64\)16547233726635086532\,
\ sr-rtptime\=\(uint\)3405294345\,\ sr-octet-count\=\(uint\)22436320\,
\ sr-packet-count\=\(uint\)140227\;" >, rtx-count=(uint)0, recv-rtx-req-count=(uint)0,
sent-rtx-req-count=(uint)0;
由于我是 Mediasoup 的新手,任何提示将不胜感激。