public void RTCPHeaderRoundTripTest() { Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name); RTCPPacket src = new RTCPPacket(12, 122, 561, 6756, 56434); byte[] reports = new byte[84]; byte[] packetBuffer = src.GetBytes(reports); RTCPPacket dst = new RTCPPacket(packetBuffer); Console.WriteLine("SenderSyncSource: " + src.SenderSyncSource + ", " + dst.SenderSyncSource); Console.WriteLine("NTPTimestamp: " + src.NTPTimestamp + ", " + dst.NTPTimestamp); Console.WriteLine("RTPTimestamp: " + src.RTPTimestamp + ", " + dst.RTPTimestamp); Console.WriteLine("SenderPacketCount: " + src.SenderPacketCount + ", " + dst.SenderPacketCount); Console.WriteLine("SenderOctetCount: " + src.SenderOctetCount + ", " + dst.SenderOctetCount); Console.WriteLine("Reports Length: " + src.Reports.Length + ", " + dst.Reports.Length); //Console.WriteLine("Raw Header: " + System.Text.Encoding.ASCII.GetString(headerBuffer, 0, headerBuffer.Length)); Assert.IsTrue(src.SenderSyncSource == dst.SenderSyncSource, "SenderSyncSource was mismatched."); Assert.IsTrue(src.NTPTimestamp == dst.NTPTimestamp, "NTPTimestamp was mismatched."); Assert.IsTrue(src.RTPTimestamp == dst.RTPTimestamp, "RTPTimestamp was mismatched."); Assert.IsTrue(src.SenderPacketCount == dst.SenderPacketCount, "SenderPacketCount was mismatched."); Assert.IsTrue(src.SenderOctetCount == dst.SenderOctetCount, "SenderOctetCount was mismatched."); Assert.IsTrue(src.Reports.Length == dst.Reports.Length, "Reports length was mismatched."); }
/// <summary> /// 发送rtcp包 /// </summary> /// <param name="ntpTimestamp"></param> /// <param name="rtpTimestamp"></param> private void SendRtcpSenderReport(ulong ntpTimestamp, uint rtpTimestamp) { try { RTCPPacket senderReport = new RTCPPacket(_rtcpSyncSource, ntpTimestamp, rtpTimestamp, _senderPacketCount, _senderOctetCount); var bytes = senderReport.GetBytes(); _rtcpSocket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, _rtcpRemoteEndPoint, SendRtcpCallback, _rtcpSocket); _senderLastSentAt = DateTime.Now; } catch (Exception excp) { logger.Error("Exception SendRtcpSenderReport. " + excp); } }
public void GetRTCPPacketTest() { Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name); RTCPPacket rtcpPacket = new RTCPPacket(1, 1, 1, 1, 1); byte[] reports = new byte[84]; byte[] packetBuffer = rtcpPacket.GetBytes(reports); int byteNum = 1; foreach (byte packetByte in packetBuffer) { Console.WriteLine(byteNum + ": " + packetByte.ToString("x")); byteNum++; } }
/// <summary> /// Processes RTCP packets. /// </summary> /// <param name="packets">The packets to process.</param> public override void ProcessRTCP(RTCPPacket[] packets) { if (Encoder != null) { foreach (var packet in packets) { if (packet is RTCPPliPacket) { Encoder.ForceKeyframe(); } else if (packet is RTCPReportPacket) { var report = (RTCPReportPacket)packet; foreach (var block in report.ReportBlocks) { Log.DebugFormat("VP8 report: {0} packet loss ({1} cumulative packets lost)", block.PercentLost.ToString("P2"), block.CumulativeNumberOfPacketsLost.ToString()); if (block.PercentLost > 0) { LosslessCount = 0; LossyCount++; if (LossyCount > 5 && (Encoder.Quality > 0.0 || Encoder.Bitrate > 64 /* || Encoder.Scale > 0.2 */)) { LossyCount = 0; if (Encoder.Quality > 0.0) { Encoder.Quality = MathAssistant.Max(0.0, Encoder.Quality - 0.1); Log.InfoFormat("Decreasing VP8 encoder quality to {0}.", Encoder.Quality.ToString("P2")); } if (Encoder.Bitrate > 64) { Encoder.Bitrate = MathAssistant.Max(64, Encoder.Bitrate - 64); Log.InfoFormat("Decreasing VP8 encoder bitrate to {0}.", Encoder.Bitrate.ToString()); } /*if (Encoder.Scale > 0.2) { Encoder.Scale = MathAssistant.Max(0.2, Encoder.Scale - 0.2); Log.InfoFormat("Decreasing VP8 encoder scale to {0}.", Encoder.Scale.ToString("P2")); }*/ } } else { LossyCount = 0; LosslessCount++; if (LosslessCount > 5 && (Encoder.Quality < 1.0 || Encoder.Bitrate < 640 /* || Encoder.Scale < 1.0 */)) { LosslessCount = 0; if (Encoder.Quality < 1.0) { Encoder.Quality = MathAssistant.Min(1.0, Encoder.Quality + 0.1); Log.InfoFormat("Increasing VP8 encoder quality to {0}.", Encoder.Quality.ToString("P2")); } if (Encoder.Bitrate < 640) { Encoder.Bitrate = MathAssistant.Min(640, Encoder.Bitrate + 64); Log.InfoFormat("Increasing VP8 encoder bitrate to {0}.", Encoder.Bitrate.ToString()); } /*if (_Encoder.Scale < 1.0) { Encoder.Scale = MathAssistant.Min(1.0, Encoder.Scale + 0.2); Log.InfoFormat("Increasing VP8 encoder scale to {0}.", Encoder.Scale.ToString("P2")); }*/ } } } } } } }
/// <summary> /// Processes RTCP packets. /// </summary> /// <param name="packets">The packets to process.</param> public override void ProcessRTCP(RTCPPacket[] packets) { if (_Encoder != null) { foreach (var packet in packets) { if (packet is RTCPReportPacket) { _ReportsReceived++; var report = (RTCPReportPacket)packet; foreach (var block in report.ReportBlocks) { Log.DebugFormat("Opus report: {0} packet loss ({1} cumulative packets lost)", block.PercentLost.ToString("P2"), block.CumulativeNumberOfPacketsLost.ToString()); if (block.PercentLost > 0) { _LosslessCount = 0; _LossyCount++; if (_LossyCount > 5 && _Encoder.Quality > 0.0) { _LossyCount = 0; _Encoder.Quality = MathAssistant.Max(0.0, _Encoder.Quality - 0.1); Log.InfoFormat("Decreasing Opus encoder quality to {0}.", _Encoder.Quality.ToString("P2")); } } else { _LossyCount = 0; _LosslessCount++; if (_LosslessCount > 5 && _Encoder.Quality < 1.0) { _LosslessCount = 0; _Encoder.Quality = MathAssistant.Min(1.0, _Encoder.Quality + 0.1); Log.InfoFormat("Increasing Opus encoder quality to {0}.", _Encoder.Quality.ToString("P2")); } } if (!DisableFEC && !FecActive && _ReportsReceived > _MinimumReportsBeforeFEC) { if ((block.PercentLost * 100) > PercentLossToTriggerFEC) { Log.InfoFormat("Activating FEC for Opus audio stream."); _Encoder.ActivateFEC(PercentLossToTriggerFEC); FecActive = true; } } } } } } }
/// <summary> /// Processes RTCP packets. /// </summary> /// <param name="packets">The packets to process.</param> public override void ProcessRTCP(RTCPPacket[] packets) { for (var i = 0; i < packets.Length; i++) { var packet = packets[i]; if (packet is RTCPPliPacket) { if (Encoder != null) { Encoder.ForceKeyframe(); } } } }
public override void ProcessRTCP(RTCPPacket[] packets) { for (int i = 0; i < packets.Length; i++) { var packet = packets[i]; if (packet is RTCPPliPacket) { if (_Encoder != null) { _Encoder.ForceKeyframe(); } } else if (packet is RTCPReportPacket) { var report = (RTCPReportPacket)packet; foreach (var block in report.ReportBlocks) { Log.DebugFormat("VP8 report: {0}% packet loss ({1} cumulative packets lost)", ((int)(block.PercentLost * 100)).ToString(), block.CumulativeNumberOfPacketsLost.ToString()); } } } }