完成多track改造

This commit is contained in:
xia-chu 2023-12-09 18:07:33 +08:00
parent 7735e6c9e3
commit f8f61660f8
7 changed files with 38 additions and 17 deletions

View File

@ -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, 那么也允许之

View File

@ -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<FrameToCache<FrameFromPtr>>(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);
});

View File

@ -86,7 +86,7 @@ public:
void addTrackCompleted() override;
/**
* track数1~2addTrackCompleted类型
* track数>=1addTrackCompleted类型
* track时
*/
void setMaxTrackCount(size_t i);

View File

@ -202,6 +202,9 @@ public:
// 支持通过on_publish返回值替换stream_id
std::string stream_replace;
// 最大track数
size_t max_track = 2;
template <typename MAP>
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:

View File

@ -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<RtmpMediaSourceMuxer>(_tuple, option, std::make_shared<TitleMeta>(dur_sec));

View File

@ -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<PlayerProxy> weakSelf = shared_from_this();
std::shared_ptr<int> piFailedCnt(new int(0)); // 连续播放失败次数
setOnPlayResult([weakSelf, strUrlTmp, piFailedCnt](const SockException &err) {

View File

@ -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));
}