优化代码

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: {
//其他codec不支持
WarnL << "暂不支持该rtsp编码类型:" << track->getName();
WarnL << "Unsupported rtsp sdp: " << track->getName();
return nullptr;
}
}
}
Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr& track) {
Track::Ptr Factory::getTrackByAbstractTrack(const Track::Ptr &track) {
auto codec = track->getCodecId();
switch (codec) {
case CodecG711A:
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;
}
if (track->getTrackType() == TrackVideo) {
return getTrackByCodecId(codec);
}
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) {
@ -143,21 +126,21 @@ RtpCodec::Ptr Factory::getRtpEncoderByCodecId(CodecId codec_id, uint8_t pt) {
return std::make_shared<CommonRtpEncoder>();
}
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) {
switch (track->getCodecId()){
RtpCodec::Ptr Factory::getRtpDecoderByCodecId(CodecId codec) {
switch (codec){
case CodecH264 : return std::make_shared<H264RtpDecoder>();
case CodecH265 : return std::make_shared<H265RtpDecoder>();
case CodecAAC : return std::make_shared<AACRtpDecoder>();
case CodecL16 :
case CodecOpus :
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>();
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") {
return CodecH265;
}
WarnL << "暂不支持该视频Amf:" << str;
WarnL << "Unsupported codec: " << str;
return CodecInvalid;
}
@ -184,7 +167,7 @@ static CodecId getVideoCodecIdByAmf(const AMFValue &val){
case RtmpVideoCodec::h265: return CodecH265;
case RtmpVideoCodec::fourcc_av1: return CodecAV1;
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;
@ -196,10 +179,11 @@ Track::Ptr Factory::getTrackByCodecId(CodecId codecId, int sample_rate, int chan
case CodecH265 : return std::make_shared<H265Track>();
case CodecAAC : return std::make_shared<AACTrack>();
case CodecOpus: return std::make_shared<OpusTrack>();
case CodecL16: return std::make_shared<L16Track>(sample_rate, channels);
case CodecG711A :
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>();
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") {
return CodecAAC;
}
WarnL << "暂不支持该音频Amf:" << str;
WarnL << "Unsupported codec: " << str;
return CodecInvalid;
}
@ -228,7 +212,7 @@ static CodecId getAudioCodecIdByAmf(const AMFValue &val) {
case RtmpAudioCodec::g711a : return CodecG711A;
case RtmpAudioCodec::g711u : return CodecG711U;
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 CodecG711A :
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);
if (audio_track->getAudioSampleRate() != 8000 || audio_track->getAudioChannel() != 1 || audio_track->getAudioSampleBit() != 16) {
//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->getAudioChannel() << "/"
<< audio_track->getAudioSampleBit()
<< ",该音频已被忽略";
<< ", ignored it";
return nullptr;
}
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解包器
*/
static RtpCodec::Ptr getRtpDecoderByTrack(const Track::Ptr &track);
static RtpCodec::Ptr getRtpDecoderByCodecId(CodecId codec);
////////////////////////////////rtmp相关//////////////////////////////////

View File

@ -89,7 +89,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track);
track->setIndex(pt);
_interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
break;
}
case Rtsp::PT_JPEG: {
@ -99,7 +99,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track);
track->setIndex(pt);
_interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
break;
}
default: {
@ -110,7 +110,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) {
CHECK(track);
track->setIndex(pt);
_interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} else if (pt == h265_pt) {
// H265负载
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);
track->setIndex(pt);
_interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} else if (pt == h264_pt) {
// H264负载
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);
track->setIndex(pt);
_interface->addTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByTrack(track);
_rtp_decoder[pt] = Factory::getRtpDecoderByCodecId(track->getCodecId());
} else {
if (pt != Rtsp::PT_MP2T && pt != ps_pt) {
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);
//生成RtpCodec对象以便解码rtp
_audio_rtp_decoder = Factory::getRtpDecoderByTrack(_audio_track);
_audio_rtp_decoder = Factory::getRtpDecoderByCodecId(_audio_track->getCodecId());
if (!_audio_rtp_decoder) {
//找不到相应的rtp解码器该track无效
_audio_track.reset();
@ -114,7 +114,7 @@ void RtspDemuxer::makeVideoTrack(const SdpTrack::Ptr &video) {
}
setBitRate(video, _video_track);
//生成RtpCodec对象以便解码rtp
_video_rtp_decoder = Factory::getRtpDecoderByTrack(_video_track);
_video_rtp_decoder = Factory::getRtpDecoderByCodecId(_video_track->getCodecId());
if (!_video_rtp_decoder) {
//找不到相应的rtp解码器该track无效
_video_track.reset();