本文共 2281 字,大约阅读时间需要 7 分钟。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | RTP Header | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | OSN | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | Original RTP Packet Payload | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
OSN:原rtp包seq number
webrtc代码实现,注释很详细
std::unique_ptrRTPSender::BuildRtxPacket( const RtpPacketToSend& packet) { // TODO(danilchap): Create rtx packet with extra capacity for SRTP // when transport interface would be updated to take buffer class. std::unique_ptr rtx_packet(new RtpPacketToSend( &rtp_header_extension_map_, packet.size() + kRtxHeaderSize)); // Add original RTP header. rtx_packet->CopyHeaderFrom(packet); { rtc::CritScope lock(&send_critsect_); if (!sending_media_) return nullptr; RTC_DCHECK(ssrc_rtx_); // Replace payload type. auto kv = rtx_payload_type_map_.find(packet.PayloadType()); if (kv == rtx_payload_type_map_.end()) return nullptr; rtx_packet->SetPayloadType(kv->second); // Replace sequence number. rtx_packet->SetSequenceNumber(sequence_number_rtx_++); // Replace SSRC. rtx_packet->SetSsrc(*ssrc_rtx_); // Possibly include the MID header extension. if (!mid_.empty()) { // This is a no-op if the MID header extension is not registered. rtx_packet->SetExtension (mid_); } } uint8_t* rtx_payload = rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize); RTC_DCHECK(rtx_payload); // Add OSN (original sequence number). ByteWriter ::WriteBigEndian(rtx_payload, packet.SequenceNumber()); // Add original payload data. auto payload = packet.payload(); memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size()); // Add original application data. rtx_packet->set_application_data(packet.application_data()); return rtx_packet;}
转载地址:http://ksprj.baihongyu.com/