完成多track改造
This commit is contained in:
parent
7735e6c9e3
commit
f8f61660f8
|
|
@ -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, 那么也允许之
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
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);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ public:
|
|||
void addTrackCompleted() override;
|
||||
|
||||
/**
|
||||
* 设置最大track数,取值范围1~2;该方法与addTrackCompleted类型;
|
||||
* 设置最大track数,取值范围>=1;该方法与addTrackCompleted类型;
|
||||
* 在设置单track时,可以加快媒体注册速度
|
||||
*/
|
||||
void setMaxTrackCount(size_t i);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue