diff --git a/api/source/mk_media.cpp b/api/source/mk_media.cpp index 9ee56fe6..0abe2f46 100755 --- a/api/source/mk_media.cpp +++ b/api/source/mk_media.cpp @@ -187,7 +187,6 @@ API_EXPORT int API_CALL mk_media_init_video(mk_media ctx, int codec_id, int widt info.iWidth = width; info.iHeight = height; info.iBitRate = bit_rate; - (*obj)->getChannel()->initVideo(info); return (*obj)->getChannel()->initVideo(info); } diff --git a/api/source/mk_track.cpp b/api/source/mk_track.cpp index 6d84ac70..b4df453d 100644 --- a/api/source/mk_track.cpp +++ b/api/source/mk_track.cpp @@ -10,12 +10,13 @@ #include "mk_track.h" #include "Extension/Track.h" +#include "Extension/Factory.h" using namespace std; using namespace toolkit; using namespace mediakit; -class VideoTrackForC : public VideoTrack { +class VideoTrackForC : public VideoTrack, public std::enable_shared_from_this { public: VideoTrackForC(int codec_id, codec_args *args) { _codec_id = (CodecId) codec_id; @@ -49,7 +50,8 @@ public: } Track::Ptr clone() override { - return std::make_shared::type>(*this); + auto track_in = std::shared_ptr(shared_from_this()); + return Factory::getTrackByAbstractTrack(track_in); } Sdp::Ptr getSdp() override { @@ -61,15 +63,16 @@ private: codec_args _args; }; -class AudioTrackForC : public AudioTrackImp { +class AudioTrackForC : public AudioTrackImp, public std::enable_shared_from_this { public: ~AudioTrackForC() override = default; AudioTrackForC(int codec_id, codec_args *args) : - AudioTrackImp((CodecId) codec_id, args->audio.sample_rate, args->audio.channels, 16) {} + AudioTrackImp((CodecId) codec_id, args->audio.sample_rate, args->audio.channels, 16) {} Track::Ptr clone() override { - return std::make_shared::type>(*this); + auto track_in = std::shared_ptr(shared_from_this()); + return Factory::getTrackByAbstractTrack(track_in); } Sdp::Ptr getSdp() override { diff --git a/api/tests/h264_media_server.c b/api/tests/h264_media_server.c index 3e0084f5..4ca99ffd 100644 --- a/api/tests/h264_media_server.c +++ b/api/tests/h264_media_server.c @@ -64,8 +64,12 @@ int main(int argc, char *argv[]) { mk_media media = mk_media_create("__defaultVhost__", "live", "test", 0, 0, 0); //h264的codec - mk_media_init_video(media, 0, 0, 0, 0, 2 * 104 * 1024); + //mk_media_init_video(media, 0, 0, 0, 0, 2 * 104 * 1024); + codec_args v_args={0}; + mk_track v_track = mk_track_create(MKCodecH264,&v_args); + mk_media_init_track(media,v_track); mk_media_init_complete(media); + mk_track_unref(v_track); //创建h264分帧器 mk_h264_splitter splitter = mk_h264_splitter_create(on_h264_frame, media); diff --git a/src/Extension/Factory.cpp b/src/Extension/Factory.cpp index d7757ecb..fae8dd8b 100644 --- a/src/Extension/Factory.cpp +++ b/src/Extension/Factory.cpp @@ -95,6 +95,32 @@ Track::Ptr Factory::getTrackBySdp(const SdpTrack::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(); + + default: { + //其他codec不支持 + WarnL << "暂不支持该该编码类型创建Track:" << track->getCodecName(); + return nullptr; + } + } +} + RtpCodec::Ptr Factory::getRtpEncoderBySdp(const Sdp::Ptr &sdp) { GET_CONFIG(uint32_t,audio_mtu,Rtp::kAudioMtuSize); GET_CONFIG(uint32_t,video_mtu,Rtp::kVideoMtuSize); diff --git a/src/Extension/Factory.h b/src/Extension/Factory.h index 3e5684f9..75c968ce 100644 --- a/src/Extension/Factory.h +++ b/src/Extension/Factory.h @@ -27,6 +27,11 @@ public: */ static Track::Ptr getTrackBySdp(const SdpTrack::Ptr &track); + /** + * 根据c api 抽象的Track生成具体Track对象 + */ + static Track::Ptr getTrackByAbstractTrack(const Track::Ptr& track); + /** * 根据sdp生成rtp编码器 * @param sdp sdp对象