rtp server支持多track

This commit is contained in:
xia-chu 2023-12-09 21:39:46 +08:00
parent f5f658e474
commit 48b7cd1462
3 changed files with 13 additions and 6 deletions

View File

@ -133,7 +133,7 @@ void DecoderImp::onTrack(int index, const Track::Ptr &track) {
if (!ref.first) { if (!ref.first) {
ref.first = track; ref.first = track;
_sink->addTrack(track); _sink->addTrack(track);
InfoL << "got track: " << track->getCodecName(); InfoL << "Got track: " << track->getCodecName();
} }
} }

View File

@ -78,7 +78,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
if (!ref) { if (!ref) {
if (_rtp_receiver.size() > 2) { if (_rtp_receiver.size() > 2) {
// 防止pt类型太多导致内存溢出 // 防止pt类型太多导致内存溢出
throw std::invalid_argument("rtp pt类型不得超过2种!"); WarnL << "Rtp payload type more than 2 types: " << _rtp_receiver.size();
} }
switch (pt) { switch (pt) {
case Rtsp::PT_PCMA: case Rtsp::PT_PCMA:
@ -87,6 +87,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
ref = std::make_shared<RtpReceiverImp>(8000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(8000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
auto track = Factory::getTrackByCodecId(pt == Rtsp::PT_PCMU ? CodecG711U : CodecG711A, 8000, 1, 16); auto track = Factory::getTrackByCodecId(pt == Rtsp::PT_PCMU ? CodecG711U : CodecG711A, 8000, 1, 16);
CHECK(track); CHECK(track);
track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
break; break;
@ -96,6 +97,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
auto track = Factory::getTrackByCodecId(CodecJPEG); auto track = Factory::getTrackByCodecId(CodecJPEG);
CHECK(track); CHECK(track);
track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
break; break;
@ -106,23 +108,28 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
ref = std::make_shared<RtpReceiverImp>(48000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(48000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
auto track = Factory::getTrackByCodecId(CodecOpus); auto track = Factory::getTrackByCodecId(CodecOpus);
CHECK(track); CHECK(track);
track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
} else if (pt == h265_pt) { } else if (pt == h265_pt) {
// H265负载 // H265负载
ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
auto track = Factory::getTrackByCodecId(CodecH265); auto track = Factory::getTrackByCodecId(CodecH265);
CHECK(track);
track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
} else if (pt == h264_pt) { } else if (pt == h264_pt) {
// H264负载 // H264负载
ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
auto track = Factory::getTrackByCodecId(CodecH264); auto track = Factory::getTrackByCodecId(CodecH264);
CHECK(track);
track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
} else { } else {
if (pt != Rtsp::PT_MP2T && pt != ps_pt) { if (pt != Rtsp::PT_MP2T && pt != ps_pt) {
WarnL << "rtp payload type未识别(" << (int)pt << "),已按ts或ps负载处理"; WarnL << "Unknown rtp payload type(" << (int)pt << "), decode it as mpeg-ps or mpeg-ts";
} }
ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); }); ref = std::make_shared<RtpReceiverImp>(90000, [this](RtpPacket::Ptr rtp) { onRtpSorted(std::move(rtp)); });
// ts或ps负载 // ts或ps负载
@ -142,7 +149,8 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
} }
} }
// 设置frame回调 // 设置frame回调
_rtp_decoder[pt]->addDelegate([this](const Frame::Ptr &frame) { _rtp_decoder[pt]->addDelegate([this, pt](const Frame::Ptr &frame) {
frame->setIndex(pt);
onRtpDecode(frame); onRtpDecode(frame);
return true; return true;
}); });

View File

@ -254,8 +254,7 @@ void RtpProcess::emitOnPublish() {
return; return;
} }
if (err.empty()) { if (err.empty()) {
strong_self->_muxer = std::make_shared<MultiMediaSourceMuxer>(strong_self->_media_info, 0.0f, strong_self->_muxer = std::make_shared<MultiMediaSourceMuxer>(strong_self->_media_info, 0.0f, option);
option);
if (strong_self->_only_audio) { if (strong_self->_only_audio) {
strong_self->_muxer->setOnlyAudio(); strong_self->_muxer->setOnlyAudio();
} }