目标

知道下面的sdp信息是在代码里如何生成的。
image.png

阶段性目标

image.png

如何确定SDP中的媒体?

image.png

AddTrack

image.png

image.png

  1. 添加媒体轨的SDP信息
  2. RTCErrorOr<rtc::scoped_refptr<RtpSenderInterface>>
  3. RtpTransmissionManager::AddTrackUnifiedPlan(
  4. rtc::scoped_refptr<MediaStreamTrackInterface> track,
  5. const std::vector<std::string>& stream_ids) {
  6. auto transceiver = FindFirstTransceiverForAddedTrack(track);
  7. if (transceiver) {
  8. RTC_LOG(LS_INFO) << "Reusing an existing "
  9. << cricket::MediaTypeToString(transceiver->media_type())
  10. << " transceiver for AddTrack.";
  11. if (transceiver->stopping()) {
  12. LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
  13. "The existing transceiver is stopping.");
  14. }
  15. if (transceiver->direction() == RtpTransceiverDirection::kRecvOnly) {
  16. transceiver->internal()->set_direction(
  17. RtpTransceiverDirection::kSendRecv);
  18. } else if (transceiver->direction() == RtpTransceiverDirection::kInactive) {
  19. transceiver->internal()->set_direction(
  20. RtpTransceiverDirection::kSendOnly);
  21. }
  22. transceiver->sender()->SetTrack(track);
  23. transceiver->internal()->sender_internal()->set_stream_ids(stream_ids);
  24. transceiver->internal()->set_reused_for_addtrack(true);
  25. } else {
  26. cricket::MediaType media_type =
  27. (track->kind() == MediaStreamTrackInterface::kAudioKind
  28. ? cricket::MEDIA_TYPE_AUDIO
  29. : cricket::MEDIA_TYPE_VIDEO);
  30. RTC_LOG(LS_INFO) << "Adding " << cricket::MediaTypeToString(media_type)
  31. << " transceiver in response to a call to AddTrack.";
  32. std::string sender_id = track->id();
  33. // Avoid creating a sender with an existing ID by generating a random ID.
  34. // This can happen if this is the second time AddTrack has created a sender
  35. // for this track.
  36. if (FindSenderById(sender_id)) {
  37. sender_id = rtc::CreateRandomUuid();
  38. }
  39. auto sender = CreateSender(media_type, sender_id, track, stream_ids, {});
  40. auto receiver = CreateReceiver(media_type, rtc::CreateRandomUuid());
  41. transceiver = CreateAndAddTransceiver(sender, receiver);
  42. transceiver->internal()->set_created_by_addtrack(true);
  43. transceiver->internal()->set_direction(RtpTransceiverDirection::kSendRecv);
  44. }
  45. return transceiver->sender();
  46. }

RtpTransceiver

image.png

RtpSender

image.png

Session层

image.png