public override MediaFrame Depacketize(RtpPacket pkt) { MediaFrame frame = null; if (pkt != null) { frame = new MediaFrame { Data = pkt.Payload.ToArray() }; } return(frame); }
public override MediaFrame Depacketize(RtpPacket pkt) { MediaFrame frame = null; if (pkt.Sequence != (lastSequence + 1)) { logger.Warn("Bad sequence " + lastSequence + " != " + pkt.Sequence); // TODO: // Добавляем в буфер и пытаемся упорядочить } lastSequence = pkt.Sequence; bool newTimestampSequence = false; var timestamp = pkt.Timestamp; if (timestamp != RtpConst.NoTimestamp && timestamp != lastTimestamp) { if (lastTimestamp != RtpConst.NoTimestamp) { var diff = (timestamp - lastTimestamp); if (diff < 0) { // TODO: } unwrappedTimestamp += diff; } lastTimestamp = timestamp; newTimestampSequence = true; // logger.Warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "); } if (newTimestampSequence) { // группируем по временным меткам // т.е сервер должен передавать данные с правильным вр.метками иначе работать не будет... if (naluBuffer.Count > 0) { var firstNalu = naluBuffer[0]; // все вр.метки должны быть одинаковые... var naluTimestamp = firstNalu.timestamp; var dataBuffer = new List <byte[]>(); int totalLength = 0; foreach (var nal in naluBuffer) { if (naluTimestamp != nal.timestamp) { logger.Warn("naluTimstamp != nal.timestamp"); } var data = nal.data; dataBuffer.Add(data); totalLength += data.Length; } //var dataBuffer = naluBuffer.Select(n => n.data); //var totalLength = dataBuffer.Sum(n => n.Length); var nalUnitData = new byte[totalLength]; int offset = 0; foreach (var data in dataBuffer) { Array.Copy(data, 0, nalUnitData, offset, data.Length); offset += data.Length; } var naluTime = (naluTimestamp / (double)ClockRate); frame = new MediaFrame { Data = nalUnitData, Time = naluTime, }; naluBuffer.Clear(); } } if (naluBuffer.Count > 256) { if (timestamp == RtpConst.NoTimestamp || lastTimestamp == RtpConst.NoTimestamp || timestamp == 0 || lastTimestamp == 0) {// если не удается получить правильные вр.метки - сбрасываем буфер // т.к декодировать не сгруппированные данные не все декодеры могу... logger.Error("No valid timestamp received; drop buffer"); naluBuffer.Clear(); } } NALUnit nalUnit = null; byte[] payload = pkt.Payload.ToArray(); if (payload != null && payload.Length > 0) { nalUnit = ParseH264Payload(payload, unwrappedTimestamp); } if (nalUnit != null) { naluBuffer.Add(nalUnit); } return(frame); //if (data != null) //{ // frame = new MediaFrame // { // Data = data, // Time = monotonicTime, // }; //} //return frame; }