diff --git a/src/Extension/Factory.cpp b/src/Extension/Factory.cpp index 65c8060a..b787a5f2 100644 --- a/src/Extension/Factory.cpp +++ b/src/Extension/Factory.cpp @@ -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(track); - return std::make_shared(codec, audio_track->getAudioSampleRate(), audio_track->getAudioChannel(), 16); - } - case CodecL16: { - auto audio_track = dynamic_pointer_cast(track); - return std::make_shared(audio_track->getAudioSampleRate(), audio_track->getAudioChannel()); - } - case CodecAAC: return std::make_shared(); - case CodecOpus: return std::make_shared(); - case CodecH265: return std::make_shared(); - case CodecH264: return std::make_shared(); - case CodecJPEG: return std::make_shared(); - - default: { - //其他codec不支持 - WarnL << "暂不支持该该编码类型创建Track:" << track->getCodecName(); - return nullptr; - } + if (track->getTrackType() == TrackVideo) { + return getTrackByCodecId(codec); } + auto audio_track = dynamic_pointer_cast(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(); } case CodecJPEG: return std::make_shared(); - 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(); case CodecH265 : return std::make_shared(); case CodecAAC : return std::make_shared(); case CodecL16 : case CodecOpus : case CodecG711A : - case CodecG711U : return std::make_shared(track->getCodecId()); + case CodecG711U : return std::make_shared(codec); case CodecJPEG: return std::make_shared(); - 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(); case CodecAAC : return std::make_shared(); case CodecOpus: return std::make_shared(); + case CodecL16: return std::make_shared(sample_rate, channels); case CodecG711A : case CodecG711U : return (sample_rate && channels && sample_bit) ? std::make_shared(codecId, sample_rate, channels, sample_bit) : nullptr; case CodecJPEG : return std::make_shared(); - 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(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(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(track); } - default : WarnL << "暂不支持该CodecId:" << track->getCodecName(); return nullptr; + default : WarnL << "Unsupported codec: " << track->getCodecName(); return nullptr; } } diff --git a/src/Extension/Factory.h b/src/Extension/Factory.h index 8342d67e..528b3b2c 100644 --- a/src/Extension/Factory.h +++ b/src/Extension/Factory.h @@ -53,7 +53,7 @@ public: /** * 根据Track生成Rtp解包器 */ - static RtpCodec::Ptr getRtpDecoderByTrack(const Track::Ptr &track); + static RtpCodec::Ptr getRtpDecoderByCodecId(CodecId codec); ////////////////////////////////rtmp相关////////////////////////////////// diff --git a/src/Rtp/GB28181Process.cpp b/src/Rtp/GB28181Process.cpp index 82f97c0f..29c9704f 100644 --- a/src/Rtp/GB28181Process.cpp +++ b/src/Rtp/GB28181Process.cpp @@ -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(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(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"; diff --git a/src/Rtsp/RtspDemuxer.cpp b/src/Rtsp/RtspDemuxer.cpp index db4c9c18..1dca605b 100644 --- a/src/Rtsp/RtspDemuxer.cpp +++ b/src/Rtsp/RtspDemuxer.cpp @@ -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();