From f8f61660f8e875407627b4a584f67b2ac6ae093a Mon Sep 17 00:00:00 2001 From: xia-chu <771730766@qq.com> Date: Sat, 9 Dec 2023 18:07:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A4=9Atrack=E6=94=B9?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/WebApi.cpp | 2 ++ src/Common/MediaSink.cpp | 34 ++++++++++++++++------------ src/Common/MediaSink.h | 2 +- src/Common/MediaSource.h | 4 ++++ src/Common/MultiMediaSourceMuxer.cpp | 1 + src/Player/PlayerProxy.cpp | 9 ++++++++ src/Record/MP4Reader.cpp | 3 ++- 7 files changed, 38 insertions(+), 17 deletions(-) diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 0985604f..c80774cc 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -1818,6 +1818,8 @@ void installWebApi() { CHECK_ARGS("vhost", "app", "stream", "file_path"); ProtocolOption option; + // mp4支持多track + option.max_track = 16; // 默认解复用mp4不生成mp4 option.enable_mp4 = false; // 但是如果参数明确指定开启mp4, 那么也允许之 diff --git a/src/Common/MediaSink.cpp b/src/Common/MediaSink.cpp index adae1738..6d9f8fbc 100644 --- a/src/Common/MediaSink.cpp +++ b/src/Common/MediaSink.cpp @@ -12,6 +12,8 @@ #include "Common/config.h" #include "Extension/Factory.h" +#define MUTE_AUDIO_INDEX 0xFFFF + using namespace std; namespace mediakit{ @@ -35,9 +37,9 @@ bool MediaSink::addTrack(const Track::Ptr &track_in) { } //克隆Track,只拷贝其数据,不拷贝其数据转发关系 auto track = track_in->clone(); - auto track_type = track->getTrackType(); - _track_map[track_type] = std::make_pair(track, false); - _track_ready_callback[track_type] = [this, track]() { + auto index = track->getIndex(); + _track_map[index] = std::make_pair(track, false); + _track_ready_callback[index] = [this, track]() { onTrackReady(track); }; _ticker.resetTime(); @@ -46,7 +48,7 @@ bool MediaSink::addTrack(const Track::Ptr &track_in) { if (_all_track_ready) { return onTrackFrame(frame); } - auto &frame_unread = _frame_unread[frame->getTrackType()]; + auto &frame_unread = _frame_unread[frame->getIndex()]; GET_CONFIG(uint32_t, kMaxUnreadyFrame, General::kUnreadyFrameCache); if (frame_unread.size() > kMaxUnreadyFrame) { @@ -72,7 +74,7 @@ void MediaSink::resetTracks() { } bool MediaSink::inputFrame(const Frame::Ptr &frame) { - auto it = _track_map.find(frame->getTrackType()); + auto it = _track_map.find(frame->getIndex()); if (it == _track_map.end()) { return false; } @@ -138,7 +140,7 @@ void MediaSink::setMaxTrackCount(size_t i) { WarnL << "All track is ready, set max track count ignored"; return; } - _max_track_size = MAX(MIN(i, 2), 1); + _max_track_size = MAX(i, 1); checkTrackIfReady(); } @@ -166,15 +168,13 @@ void MediaSink::emitAllTrackReady() { //最少有一个有效的Track onAllTrackReady_l(); - //全部Track就绪,我们一次性把之前的帧输出 - for(auto &pr : _frame_unread){ + // 全部Track就绪,我们一次性把之前的帧输出 + for (auto &pr : _frame_unread) { if (_track_map.find(pr.first) == _track_map.end()) { - //该Track已经被移除 + // 该Track已经被移除 continue; } - pr.second.for_each([&](const Frame::Ptr &frame) { - MediaSink::inputFrame(frame); - }); + pr.second.for_each([&](const Frame::Ptr &frame) { MediaSink::inputFrame(frame); }); } _frame_unread.clear(); } @@ -236,6 +236,7 @@ bool MuteAudioMaker::inputFrame(const Frame::Ptr &frame) { _audio_idx = audio_idx; auto aacFrame = std::make_shared>(CodecAAC, (char *) MUTE_ADTS_DATA, sizeof(s_mute_adts), _audio_idx * MUTE_ADTS_DATA_MS, 0, 7); + aacFrame->setIndex(MUTE_AUDIO_INDEX); return FrameDispatcher::inputFrame(aacFrame); } } @@ -246,12 +247,15 @@ bool MediaSink::addMuteAudioTrack() { if (!_enable_audio) { return false; } - if (_track_map.find(TrackAudio) != _track_map.end()) { - return false; + for (auto &pr : _track_map) { + if (pr.second.first->getTrackType() == TrackAudio) { + return false; + } } auto audio = Factory::getTrackByCodecId(CodecAAC); + audio->setIndex(MUTE_AUDIO_INDEX); audio->setExtraData(ADTS_CONFIG, 2); - _track_map[audio->getTrackType()] = std::make_pair(audio, true); + _track_map[MUTE_AUDIO_INDEX] = std::make_pair(audio, true); audio->addDelegate([this](const Frame::Ptr &frame) { return onTrackFrame(frame); }); diff --git a/src/Common/MediaSink.h b/src/Common/MediaSink.h index c3cd94d6..f1f6db11 100644 --- a/src/Common/MediaSink.h +++ b/src/Common/MediaSink.h @@ -86,7 +86,7 @@ public: void addTrackCompleted() override; /** - * 设置最大track数,取值范围1~2;该方法与addTrackCompleted类型; + * 设置最大track数,取值范围>=1;该方法与addTrackCompleted类型; * 在设置单track时,可以加快媒体注册速度 */ void setMaxTrackCount(size_t i); diff --git a/src/Common/MediaSource.h b/src/Common/MediaSource.h index 7d423f0b..4c6b33e9 100644 --- a/src/Common/MediaSource.h +++ b/src/Common/MediaSource.h @@ -202,6 +202,9 @@ public: // 支持通过on_publish返回值替换stream_id std::string stream_replace; + // 最大track数 + size_t max_track = 2; + template ProtocolOption(const MAP &allArgs) : ProtocolOption() { load(allArgs); @@ -237,6 +240,7 @@ public: GET_OPT_VALUE(hls_save_path); GET_OPT_VALUE(stream_replace); + GET_OPT_VALUE(max_track); } private: diff --git a/src/Common/MultiMediaSourceMuxer.cpp b/src/Common/MultiMediaSourceMuxer.cpp index 1af858ba..5b3b8d72 100644 --- a/src/Common/MultiMediaSourceMuxer.cpp +++ b/src/Common/MultiMediaSourceMuxer.cpp @@ -178,6 +178,7 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const MediaTuple& tuple, float dur_ _create_in_poller = _poller->isCurrentThread(); _option = option; _dur_sec = dur_sec; + setMaxTrackCount(option.max_track); if (option.enable_rtmp) { _rtmp = std::make_shared(_tuple, option, std::make_shared(dur_sec)); diff --git a/src/Player/PlayerProxy.cpp b/src/Player/PlayerProxy.cpp index a0a57ffe..0f31e33b 100644 --- a/src/Player/PlayerProxy.cpp +++ b/src/Player/PlayerProxy.cpp @@ -96,7 +96,16 @@ void PlayerProxy::setTranslationInfo() } } +static int getMaxTrackSize(const std::string &url) { + if (url.find(".m3u8") != std::string::npos || url.find(".ts") != std::string::npos) { + // hls和ts协议才开放多track支持 + return 16; + } + return 2; +} + void PlayerProxy::play(const string &strUrlTmp) { + _option.max_track = getMaxTrackSize(strUrlTmp); weak_ptr weakSelf = shared_from_this(); std::shared_ptr piFailedCnt(new int(0)); // 连续播放失败次数 setOnPlayResult([weakSelf, strUrlTmp, piFailedCnt](const SockException &err) { diff --git a/src/Record/MP4Reader.cpp b/src/Record/MP4Reader.cpp index aa5fe1a6..e70f9fe8 100644 --- a/src/Record/MP4Reader.cpp +++ b/src/Record/MP4Reader.cpp @@ -27,7 +27,8 @@ MP4Reader::MP4Reader(const std::string &vhost, const std::string &app, const std option.enable_mp4 = false; option.enable_hls = false; option.enable_hls_fmp4 = false; - + // mp4支持多track + option.max_track = 16; setup(vhost, app, stream_id, file_path, option, std::move(poller)); }