优化代码

This commit is contained in:
xia-chu 2023-12-10 08:58:48 +08:00
parent 64f15202de
commit f9963a851b
4 changed files with 29 additions and 45 deletions

View File

@ -96,36 +96,19 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::Ptr &track) {
default: { default: {
//其他codec不支持 //其他codec不支持
WarnL << "暂不支持该rtsp编码类型:" << track->getName(); WarnL << "Unsupported rtsp sdp: " << track->getName();
return nullptr; return nullptr;
} }
} }
} }
Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr& track) { Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr &track) {
auto codec = track->getCodecId(); auto codec = track->getCodecId();
switch (codec) { if (track->getTrackType() == TrackVideo) {
case CodecG711A: return getTrackByCodecId(codec);
case CodecG711U: {
auto audio_track = dynamic_pointer_cast<AudioTrackImp>(track);
return std::make_shared<G711Track>(codec, audio_track->getAudioSampleRate(), audio_track->getAudioChannel(), 16);
}
case CodecL16: {
auto audio_track = dynamic_pointer_cast<AudioTrackImp>(track);
return std::make_shared<L16Track>(audio_track->getAudioSampleRate(), audio_track->getAudioChannel());
}
case CodecAAC: return std::make_shared<AACTrack>();
case CodecOpus: return std::make_shared<OpusTrack>();
case CodecH265: return std::make_shared<H265Track>();
case CodecH264: return std::make_shared<H264Track>();
case CodecJPEG: return std::make_shared<JPEGTrack>();
default: {
//其他codec不支持
WarnL << "暂不支持该该编码类型创建Track:" << track->getCodecName();
return nullptr;
}
} }
auto audio_track = dynamic_pointer_cast<AudioTrack>(track);
return getTrackByCodecId(codec, audio_track->getAudioSampleRate(), audio_track->getAudioChannel(), audio_track->getAudioSampleBit());
} }
RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec_id, uint8_t pt) { RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec_id, uint8_t pt) {
@ -143,21 +126,21 @@ RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec_id, uint8_t pt) {
return std::make_shared<CommonRtpEncoder>(); return std::make_shared<CommonRtpEncoder>();
} }
case CodecJPEG: return std::make_shared<JPEGRtpEncoder>(); case CodecJPEG: return std::make_shared<JPEGRtpEncoder>();
default: WarnL << "暂不支持该CodecId:" << codec_id; return nullptr; default: WarnL << "Unsupported codec: " << codec_id; return nullptr;
} }
} }
RtpCodec::Ptr Factory::getRtpDecoderByTrack(const Track::Ptr &track) { RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
switch (track->getCodecId()){ switch (codec){
case CodecH264 : return std::make_shared<H264RtpDecoder>(); case CodecH264 : return std::make_shared<H264RtpDecoder>();
case CodecH265 : return std::make_shared<H265RtpDecoder>(); case CodecH265 : return std::make_shared<H265RtpDecoder>();
case CodecAAC : return std::make_shared<AACRtpDecoder>(); case CodecAAC : return std::make_shared<AACRtpDecoder>();
case CodecL16 : case CodecL16 :
case CodecOpus : case CodecOpus :
case CodecG711A : case CodecG711A :
case CodecG711U : return std::make_shared<CommonRtpDecoder>(track->getCodecId()); case CodecG711U : return std::make_shared<CommonRtpDecoder>(codec);
case CodecJPEG: return std::make_shared<JPEGRtpDecoder>(); case CodecJPEG: return std::make_shared<JPEGRtpDecoder>();
default : WarnL << "暂不支持该CodecId:" << track->getCodecName(); return nullptr; default : WarnL << "Unsupported codec: " << getCodecName(codec); return nullptr;
} }
} }
@ -172,7 +155,7 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
if (str == "hev1" || str == "hvc1") { if (str == "hev1" || str == "hvc1") {
return CodecH265; return CodecH265;
} }
WarnL << "暂不支持该视频Amf:" << str; WarnL << "Unsupported codec: " << str;
return CodecInvalid; return CodecInvalid;
} }
@ -184,7 +167,7 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
case RtmpVideoCodec::h265: return CodecH265; case RtmpVideoCodec::h265: return CodecH265;
case RtmpVideoCodec::fourcc_av1: return CodecAV1; case RtmpVideoCodec::fourcc_av1: return CodecAV1;
case RtmpVideoCodec::fourcc_vp9: return CodecVP9; case RtmpVideoCodec::fourcc_vp9: return CodecVP9;
default: WarnL << "暂不支持该视频Amf:" << (int)type_id; return CodecInvalid; default: WarnL << "Unsupported codec: " << (int)type_id; return CodecInvalid;
} }
} }
return CodecInvalid; return CodecInvalid;
@ -196,10 +179,11 @@ Track::Ptr Factory::getTrackByCodecId(CodecId codecId, int sample_rate, int chan
case CodecH265 : return std::make_shared<H265Track>(); case CodecH265 : return std::make_shared<H265Track>();
case CodecAAC : return std::make_shared<AACTrack>(); case CodecAAC : return std::make_shared<AACTrack>();
case CodecOpus: return std::make_shared<OpusTrack>(); case CodecOpus: return std::make_shared<OpusTrack>();
case CodecL16: return std::make_shared<L16Track>(sample_rate, channels);
case CodecG711A : case CodecG711A :
case CodecG711U : return (sample_rate && channels && sample_bit) ? std::make_shared<G711Track>(codecId, sample_rate, channels, sample_bit) : nullptr; case CodecG711U : return (sample_rate && channels && sample_bit) ? std::make_shared<G711Track>(codecId, sample_rate, channels, sample_bit) : nullptr;
case CodecJPEG : return std::make_shared<JPEGTrack>(); case CodecJPEG : return std::make_shared<JPEGTrack>();
default : WarnL << "暂不支持该CodecId:" << codecId; return nullptr; default : WarnL << "Unsupported codec: " << codecId; return nullptr;
} }
} }
@ -217,7 +201,7 @@ static CodecId getAudioCodecIdByAmf(const AMFValue &val) {
if (str == "mp4a") { if (str == "mp4a") {
return CodecAAC; return CodecAAC;
} }
WarnL << "暂不支持该音频Amf:" << str; WarnL << "Unsupported codec: " << str;
return CodecInvalid; return CodecInvalid;
} }
@ -228,7 +212,7 @@ static CodecId getAudioCodecIdByAmf(const AMFValue &val) {
case RtmpAudioCodec::g711a : return CodecG711A; case RtmpAudioCodec::g711a : return CodecG711A;
case RtmpAudioCodec::g711u : return CodecG711U; case RtmpAudioCodec::g711u : return CodecG711U;
case RtmpAudioCodec::opus : return CodecOpus; case RtmpAudioCodec::opus : return CodecOpus;
default : WarnL << "暂不支持该音频Amf:" << (int)type_id; return CodecInvalid; default : WarnL << "Unsupported codec: " << (int)type_id; return CodecInvalid;
} }
} }
@ -251,7 +235,7 @@ RtmpCodec::Ptr Factory::getRtmpDecoderByTrack(const Track::Ptr &track) {
case CodecOpus : case CodecOpus :
case CodecG711A : case CodecG711A :
case CodecG711U : return std::make_shared<CommonRtmpDecoder>(track); case CodecG711U : return std::make_shared<CommonRtmpDecoder>(track);
default : WarnL << "暂不支持该CodecId:" << track->getCodecName(); return nullptr; default : WarnL << "Unsupported codec: " << track->getCodecName(); return nullptr;
} }
} }
@ -266,16 +250,16 @@ RtmpCodec::Ptr Factory::getRtmpEncoderByTrack(const Track::Ptr &track) {
auto audio_track = dynamic_pointer_cast<AudioTrack>(track); auto audio_track = dynamic_pointer_cast<AudioTrack>(track);
if (audio_track->getAudioSampleRate() != 8000 || audio_track->getAudioChannel() != 1 || audio_track->getAudioSampleBit() != 16) { if (audio_track->getAudioSampleRate() != 8000 || audio_track->getAudioChannel() != 1 || audio_track->getAudioSampleBit() != 16) {
//rtmp对g711只支持8000/1/16规格但是ZLMediaKit可以解析其他规格的G711 //rtmp对g711只支持8000/1/16规格但是ZLMediaKit可以解析其他规格的G711
WarnL << "RTMP只支持8000/1/16规格的G711,目前规格是:" WarnL << "RTMP only support G711 with 8000/1/16, now is"
<< audio_track->getAudioSampleRate() << "/" << audio_track->getAudioSampleRate() << "/"
<< audio_track->getAudioChannel() << "/" << audio_track->getAudioChannel() << "/"
<< audio_track->getAudioSampleBit() << audio_track->getAudioSampleBit()
<< ",该音频已被忽略"; << ", ignored it";
return nullptr; return nullptr;
} }
return std::make_shared<CommonRtmpEncoder>(track); return std::make_shared<CommonRtmpEncoder>(track);
} }
default : WarnL << "暂不支持该CodecId:" << track->getCodecName(); return nullptr; default : WarnL << "Unsupported codec: " << track->getCodecName(); return nullptr;
} }
} }

View File

@ -53,7 +53,7 @@ public:
/** /**
* Track生成Rtp解包器 * Track生成Rtp解包器
*/ */
static RtpCodec::Ptr getRtpDecoderByTrack(const Track::Ptr &track); static RtpCodec::Ptr getRtpDecoderByCodecId(CodecId codec);
////////////////////////////////rtmp相关////////////////////////////////// ////////////////////////////////rtmp相关//////////////////////////////////

View File

@ -89,7 +89,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track); CHECK(track);
track->setIndex(pt); track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
break; break;
} }
case Rtsp::PT_JPEG: { case Rtsp::PT_JPEG: {
@ -99,7 +99,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track); CHECK(track);
track->setIndex(pt); track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
break; break;
} }
default: { default: {
@ -110,7 +110,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track); CHECK(track);
track->setIndex(pt); track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} 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)); });
@ -118,7 +118,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track); CHECK(track);
track->setIndex(pt); track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} 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)); });
@ -126,7 +126,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track); CHECK(track);
track->setIndex(pt); track->setIndex(pt);
_interface->addTrack(track); _interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track); _rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} else { } else {
if (pt != Rtsp::PT_MP2T && pt != ps_pt) { if (pt != Rtsp::PT_MP2T && pt != ps_pt) {
WarnL << "Unknown rtp payload type(" << (int)pt << "), decode it as mpeg-ps or mpeg-ts"; WarnL << "Unknown rtp payload type(" << (int)pt << "), decode it as mpeg-ps or mpeg-ts";

View File

@ -92,7 +92,7 @@ void RtspDemuxer::makeAudioTrack(const SdpTrack::Ptr &audio) {
} }
setBitRate(audio, _audio_track); setBitRate(audio, _audio_track);
//生成RtpCodec对象以便解码rtp //生成RtpCodec对象以便解码rtp
_audio_rtp_decoder = Factory::getRtpDecoderByTrack(_audio_track); _audio_rtp_decoder = Factory::getRtpDecoderByCodecId(_audio_track->getCodecId());
if (!_audio_rtp_decoder) { if (!_audio_rtp_decoder) {
//找不到相应的rtp解码器该track无效 //找不到相应的rtp解码器该track无效
_audio_track.reset(); _audio_track.reset();
@ -114,7 +114,7 @@ void RtspDemuxer::makeVideoTrack(const SdpTrack::Ptr &video) {
} }
setBitRate(video, _video_track); setBitRate(video, _video_track);
//生成RtpCodec对象以便解码rtp //生成RtpCodec对象以便解码rtp
_video_rtp_decoder = Factory::getRtpDecoderByTrack(_video_track); _video_rtp_decoder = Factory::getRtpDecoderByCodecId(_video_track->getCodecId());
if (!_video_rtp_decoder) { if (!_video_rtp_decoder) {
//找不到相应的rtp解码器该track无效 //找不到相应的rtp解码器该track无效
_video_track.reset(); _video_track.reset();