修复单词拼错
This commit is contained in:
commit
a052e2c582
|
|
@ -1 +1 @@
|
||||||
Subproject commit a4771b353d9ebe1bc162364237a31f4184a7c435
|
Subproject commit 12c2ec7b07dce1b6a0543d9979f5c5231f69e828
|
||||||
|
|
@ -1758,10 +1758,16 @@
|
||||||
"value": "obs",
|
"value": "obs",
|
||||||
"description": "流id,例如 obs"
|
"description": "流id,例如 obs"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"key": "ssrc_multi_send",
|
||||||
|
"value": "0",
|
||||||
|
"description": "是否支持同ssrc推流到多个上级服务器,该参数非必选参数 默认false",
|
||||||
|
"disabled": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"key": "ssrc",
|
"key": "ssrc",
|
||||||
"value": "1",
|
"value": "1",
|
||||||
"description": "rtp推流的ssrc,ssrc不同时,可以推流到多个上级服务器"
|
"description": "rtp推流的ssrc"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"key": "dst_url",
|
"key": "dst_url",
|
||||||
|
|
|
||||||
|
|
@ -1182,6 +1182,7 @@ void installWebApi() {
|
||||||
//回复json
|
//回复json
|
||||||
val["port"] = port;
|
val["port"] = port;
|
||||||
});
|
});
|
||||||
|
|
||||||
api_regist("/index/api/openRtpServerMultiplex", [](API_ARGS_MAP) {
|
api_regist("/index/api/openRtpServerMultiplex", [](API_ARGS_MAP) {
|
||||||
CHECK_SECRET();
|
CHECK_SECRET();
|
||||||
CHECK_ARGS("port", "stream_id");
|
CHECK_ARGS("port", "stream_id");
|
||||||
|
|
@ -1263,6 +1264,7 @@ void installWebApi() {
|
||||||
args.passive = false;
|
args.passive = false;
|
||||||
args.dst_url = allArgs["dst_url"];
|
args.dst_url = allArgs["dst_url"];
|
||||||
args.dst_port = allArgs["dst_port"];
|
args.dst_port = allArgs["dst_port"];
|
||||||
|
args.ssrc_multi_send = allArgs["ssrc_multi_send"].empty() ? false : allArgs["ssrc_multi_send"].as<bool>();
|
||||||
args.ssrc = allArgs["ssrc"];
|
args.ssrc = allArgs["ssrc"];
|
||||||
args.is_udp = allArgs["is_udp"];
|
args.is_udp = allArgs["is_udp"];
|
||||||
args.src_port = allArgs["src_port"];
|
args.src_port = allArgs["src_port"];
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,8 @@ public:
|
||||||
bool passive = false;
|
bool passive = false;
|
||||||
// rtp payload type
|
// rtp payload type
|
||||||
uint8_t pt = 96;
|
uint8_t pt = 96;
|
||||||
|
//是否支持同ssrc多服务器发送
|
||||||
|
bool ssrc_multi_send = false;
|
||||||
// 指定rtp ssrc
|
// 指定rtp ssrc
|
||||||
std::string ssrc;
|
std::string ssrc;
|
||||||
// 指定本地发送端口
|
// 指定本地发送端口
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
|
||||||
_StrPrinter codec_info;
|
_StrPrinter codec_info;
|
||||||
auto tracks = track_src->getTracks(true);
|
auto tracks = track_src->getTracks(true);
|
||||||
for (auto &track : tracks) {
|
for (auto &track : tracks) {
|
||||||
|
track->update();
|
||||||
auto codec_type = track->getTrackType();
|
auto codec_type = track->getTrackType();
|
||||||
codec_info << track->getCodecName();
|
codec_info << track->getCodecName();
|
||||||
switch (codec_type) {
|
switch (codec_type) {
|
||||||
|
|
@ -290,12 +291,14 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE
|
||||||
|
|
||||||
auto ring = _ring;
|
auto ring = _ring;
|
||||||
auto ssrc = args.ssrc;
|
auto ssrc = args.ssrc;
|
||||||
|
auto ssrc_multi_send = args.ssrc_multi_send;
|
||||||
auto tracks = getTracks(false);
|
auto tracks = getTracks(false);
|
||||||
auto poller = getOwnerPoller(sender);
|
auto poller = getOwnerPoller(sender);
|
||||||
auto rtp_sender = std::make_shared<RtpSender>(poller);
|
auto rtp_sender = std::make_shared<RtpSender>(poller);
|
||||||
|
|
||||||
weak_ptr<MultiMediaSourceMuxer> weak_self = shared_from_this();
|
weak_ptr<MultiMediaSourceMuxer> weak_self = shared_from_this();
|
||||||
|
|
||||||
rtp_sender->startSend(args, [ssrc, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable {
|
rtp_sender->startSend(args, [ssrc,ssrc_multi_send, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable {
|
||||||
cb(local_port, ex);
|
cb(local_port, ex);
|
||||||
auto strong_self = weak_self.lock();
|
auto strong_self = weak_self.lock();
|
||||||
if (!strong_self || ex) {
|
if (!strong_self || ex) {
|
||||||
|
|
@ -324,7 +327,10 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE
|
||||||
|
|
||||||
// 可能归属线程发生变更
|
// 可能归属线程发生变更
|
||||||
strong_self->getOwnerPoller(MediaSource::NullMediaSource())->async([=]() {
|
strong_self->getOwnerPoller(MediaSource::NullMediaSource())->async([=]() {
|
||||||
strong_self->_rtp_sender[ssrc] = std::move(reader);
|
if(!ssrc_multi_send) {
|
||||||
|
strong_self->_rtp_sender.erase(ssrc);
|
||||||
|
}
|
||||||
|
strong_self->_rtp_sender.emplace(ssrc,reader);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ private:
|
||||||
toolkit::Ticker _last_check;
|
toolkit::Ticker _last_check;
|
||||||
Stamp _stamp[2];
|
Stamp _stamp[2];
|
||||||
std::weak_ptr<Listener> _track_listener;
|
std::weak_ptr<Listener> _track_listener;
|
||||||
std::unordered_map<std::string, RingType::RingReader::Ptr> _rtp_sender;
|
std::unordered_multimap<std::string, RingType::RingReader::Ptr> _rtp_sender;
|
||||||
FMP4MediaSourceMuxer::Ptr _fmp4;
|
FMP4MediaSourceMuxer::Ptr _fmp4;
|
||||||
RtmpMediaSourceMuxer::Ptr _rtmp;
|
RtmpMediaSourceMuxer::Ptr _rtmp;
|
||||||
RtspMediaSourceMuxer::Ptr _rtsp;
|
RtspMediaSourceMuxer::Ptr _rtsp;
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,10 @@ static void dumpAdtsHeader(const AdtsHeader &hed, uint8_t *out) {
|
||||||
out[6] |= (hed.no_raw_data_blocks_in_frame & 0x03); // 2 bit
|
out[6] |= (hed.no_raw_data_blocks_in_frame & 0x03); // 2 bit
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parseAacConfig(const string &config, AdtsHeader &adts) {
|
static bool parseAacConfig(const string &config, AdtsHeader &adts) {
|
||||||
|
if (config.size() < 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
uint8_t cfg1 = config[0];
|
uint8_t cfg1 = config[0];
|
||||||
uint8_t cfg2 = config[1];
|
uint8_t cfg2 = config[1];
|
||||||
|
|
||||||
|
|
@ -94,6 +97,7 @@ static void parseAacConfig(const string &config, AdtsHeader &adts) {
|
||||||
adts.aac_frame_length = 7;
|
adts.aac_frame_length = 7;
|
||||||
adts.adts_buffer_fullness = 2047;
|
adts.adts_buffer_fullness = 2047;
|
||||||
adts.no_raw_data_blocks_in_frame = 0;
|
adts.no_raw_data_blocks_in_frame = 0;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
#endif// ENABLE_MP4
|
#endif// ENABLE_MP4
|
||||||
|
|
||||||
|
|
@ -171,7 +175,9 @@ int dumpAacConfig(const string &config, size_t length, uint8_t *out, size_t out_
|
||||||
bool parseAacConfig(const string &config, int &samplerate, int &channels) {
|
bool parseAacConfig(const string &config, int &samplerate, int &channels) {
|
||||||
#ifndef ENABLE_MP4
|
#ifndef ENABLE_MP4
|
||||||
AdtsHeader header;
|
AdtsHeader header;
|
||||||
parseAacConfig(config, header);
|
if (!parseAacConfig(config, header)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
samplerate = samplingFrequencyTable[header.sf_index];
|
samplerate = samplingFrequencyTable[header.sf_index];
|
||||||
channels = header.channel_configuration;
|
channels = header.channel_configuration;
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -326,11 +332,14 @@ bool AACTrack::inputFrame_l(const Frame::Ptr &frame) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AACTrack::onReady() {
|
bool AACTrack::update() {
|
||||||
if (_cfg.size() < 2) {
|
return parseAacConfig(_cfg, _sampleRate, _channel);
|
||||||
return;
|
}
|
||||||
|
|
||||||
|
void AACTrack::onReady() {
|
||||||
|
if (!parseAacConfig(_cfg, _sampleRate, _channel)) {
|
||||||
|
_cfg.clear();
|
||||||
}
|
}
|
||||||
parseAacConfig(_cfg, _sampleRate, _channel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Track::Ptr AACTrack::clone() {
|
Track::Ptr AACTrack::clone() {
|
||||||
|
|
@ -342,6 +351,7 @@ Sdp::Ptr AACTrack::getSdp() {
|
||||||
WarnL << getCodecName() << " Track未准备好";
|
WarnL << getCodecName() << " Track未准备好";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
update();
|
||||||
return std::make_shared<AACSdp>(getConfig(), getAudioSampleRate(), getAudioChannel(), getBitRate() / 1024);
|
return std::make_shared<AACSdp>(getConfig(), getAudioSampleRate(), getAudioChannel(), getBitRate() / 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,7 @@ public:
|
||||||
int getAudioSampleRate() const override;
|
int getAudioSampleRate() const override;
|
||||||
int getAudioSampleBit() const override;
|
int getAudioSampleBit() const override;
|
||||||
bool inputFrame(const Frame::Ptr &frame) override;
|
bool inputFrame(const Frame::Ptr &frame) override;
|
||||||
|
bool update() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onReady();
|
void onReady();
|
||||||
|
|
|
||||||
|
|
@ -168,6 +168,10 @@ bool H264Track::inputFrame(const Frame::Ptr &frame) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool H264Track::update() {
|
||||||
|
return getAVCInfo(_sps, _width, _height, _fps);
|
||||||
|
}
|
||||||
|
|
||||||
void H264Track::onReady() {
|
void H264Track::onReady() {
|
||||||
if (!getAVCInfo(_sps, _width, _height, _fps)) {
|
if (!getAVCInfo(_sps, _width, _height, _fps)) {
|
||||||
_sps.clear();
|
_sps.clear();
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@ public:
|
||||||
int getVideoWidth() const override;
|
int getVideoWidth() const override;
|
||||||
float getVideoFps() const override;
|
float getVideoFps() const override;
|
||||||
bool inputFrame(const Frame::Ptr &frame) override;
|
bool inputFrame(const Frame::Ptr &frame) override;
|
||||||
|
bool update() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onReady();
|
void onReady();
|
||||||
|
|
|
||||||
|
|
@ -44,13 +44,15 @@ H264Frame::Ptr H264RtpDecoder::obtainFrame() {
|
||||||
|
|
||||||
bool H264RtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) {
|
bool H264RtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool key_pos) {
|
||||||
auto seq = rtp->getSeq();
|
auto seq = rtp->getSeq();
|
||||||
auto ret = decodeRtp(rtp);
|
auto last_is_gop = _is_gop;
|
||||||
|
_is_gop = decodeRtp(rtp);
|
||||||
if (!_gop_dropped && seq != (uint16_t)(_last_seq + 1) && _last_seq) {
|
if (!_gop_dropped && seq != (uint16_t)(_last_seq + 1) && _last_seq) {
|
||||||
_gop_dropped = true;
|
_gop_dropped = true;
|
||||||
WarnL << "start drop h264 gop, last seq:" << _last_seq << ", rtp:\r\n" << rtp->dumpString();
|
WarnL << "start drop h264 gop, last seq:" << _last_seq << ", rtp:\r\n" << rtp->dumpString();
|
||||||
}
|
}
|
||||||
_last_seq = seq;
|
_last_seq = seq;
|
||||||
return ret;
|
// 确保有sps rtp的时候,gop从sps开始;否则从关键帧开始
|
||||||
|
return _is_gop && !last_is_gop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -74,7 +76,7 @@ bool H264RtpDecoder::singleFrame(const RtpPacket::Ptr &rtp, const uint8_t *ptr,
|
||||||
_frame->_buffer.assign("\x00\x00\x00\x01", 4);
|
_frame->_buffer.assign("\x00\x00\x00\x01", 4);
|
||||||
_frame->_buffer.append((char *) ptr, size);
|
_frame->_buffer.append((char *) ptr, size);
|
||||||
_frame->_pts = stamp;
|
_frame->_pts = stamp;
|
||||||
auto key = _frame->keyFrame();
|
auto key = _frame->keyFrame() || _frame->configFrame();
|
||||||
outputFrame(rtp, _frame);
|
outputFrame(rtp, _frame);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
@ -127,7 +129,7 @@ bool H264RtpDecoder::mergeFu(const RtpPacket::Ptr &rtp, const uint8_t *ptr, ssiz
|
||||||
|
|
||||||
if (!fu->end_bit) {
|
if (!fu->end_bit) {
|
||||||
//非末尾包
|
//非末尾包
|
||||||
return fu->start_bit ? _frame->keyFrame() : false;
|
return fu->start_bit ? (_frame->keyFrame() || _frame->configFrame()) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//确保下一次fu必须收到第一个包
|
//确保下一次fu必须收到第一个包
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ private:
|
||||||
void outputFrame(const RtpPacket::Ptr &rtp, const H264Frame::Ptr &frame);
|
void outputFrame(const RtpPacket::Ptr &rtp, const H264Frame::Ptr &frame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _is_gop = false;
|
||||||
bool _gop_dropped = false;
|
bool _gop_dropped = false;
|
||||||
bool _fu_dropped = true;
|
bool _fu_dropped = true;
|
||||||
uint16_t _last_seq = 0;
|
uint16_t _last_seq = 0;
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,10 @@ bool H265Track::inputFrame_l(const Frame::Ptr &frame) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool H265Track::update() {
|
||||||
|
return getHEVCInfo(_vps, _sps, _width, _height, _fps);
|
||||||
|
}
|
||||||
|
|
||||||
void H265Track::onReady() {
|
void H265Track::onReady() {
|
||||||
if (!getHEVCInfo(_vps, _sps, _width, _height, _fps)) {
|
if (!getHEVCInfo(_vps, _sps, _width, _height, _fps)) {
|
||||||
_vps.clear();
|
_vps.clear();
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,7 @@ public:
|
||||||
int getVideoHeight() const override;
|
int getVideoHeight() const override;
|
||||||
float getVideoFps() const override;
|
float getVideoFps() const override;
|
||||||
bool inputFrame(const Frame::Ptr &frame) override;
|
bool inputFrame(const Frame::Ptr &frame) override;
|
||||||
|
bool update() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onReady();
|
void onReady();
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,7 @@ bool H265RtpDecoder::mergeFu(const RtpPacket::Ptr &rtp, const uint8_t *ptr, ssiz
|
||||||
|
|
||||||
if (!e_bit) {
|
if (!e_bit) {
|
||||||
//非末尾包
|
//非末尾包
|
||||||
return s_bit ? _frame->keyFrame() : false;
|
return s_bit ? (_frame->keyFrame() || _frame->configFrame()) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//确保下一次fu必须收到第一个包
|
//确保下一次fu必须收到第一个包
|
||||||
|
|
@ -175,13 +175,15 @@ bool H265RtpDecoder::mergeFu(const RtpPacket::Ptr &rtp, const uint8_t *ptr, ssiz
|
||||||
|
|
||||||
bool H265RtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool) {
|
bool H265RtpDecoder::inputRtp(const RtpPacket::Ptr &rtp, bool) {
|
||||||
auto seq = rtp->getSeq();
|
auto seq = rtp->getSeq();
|
||||||
auto ret = decodeRtp(rtp);
|
auto last_is_gop = _is_gop;
|
||||||
|
_is_gop = decodeRtp(rtp);
|
||||||
if (!_gop_dropped && seq != (uint16_t) (_last_seq + 1) && _last_seq) {
|
if (!_gop_dropped && seq != (uint16_t) (_last_seq + 1) && _last_seq) {
|
||||||
_gop_dropped = true;
|
_gop_dropped = true;
|
||||||
WarnL << "start drop h265 gop, last seq:" << _last_seq << ", rtp:\r\n" << rtp->dumpString();
|
WarnL << "start drop h265 gop, last seq:" << _last_seq << ", rtp:\r\n" << rtp->dumpString();
|
||||||
}
|
}
|
||||||
_last_seq = seq;
|
_last_seq = seq;
|
||||||
return ret;
|
// 确保有sps rtp的时候,gop从sps开始;否则从关键帧开始
|
||||||
|
return _is_gop && !last_is_gop;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool H265RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
bool H265RtpDecoder::decodeRtp(const RtpPacket::Ptr &rtp) {
|
||||||
|
|
@ -220,7 +222,7 @@ bool H265RtpDecoder::singleFrame(const RtpPacket::Ptr &rtp, const uint8_t *ptr,
|
||||||
_frame->_buffer.assign("\x00\x00\x00\x01", 4);
|
_frame->_buffer.assign("\x00\x00\x00\x01", 4);
|
||||||
_frame->_buffer.append((char *) ptr, size);
|
_frame->_buffer.append((char *) ptr, size);
|
||||||
_frame->_pts = stamp;
|
_frame->_pts = stamp;
|
||||||
auto key = _frame->keyFrame();
|
auto key = _frame->keyFrame() || _frame->configFrame();
|
||||||
outputFrame(rtp, _frame);
|
outputFrame(rtp, _frame);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,7 @@ private:
|
||||||
void outputFrame(const RtpPacket::Ptr &rtp, const H265Frame::Ptr &frame);
|
void outputFrame(const RtpPacket::Ptr &rtp, const H265Frame::Ptr &frame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _is_gop = false;
|
||||||
bool _using_donl_field = false;
|
bool _using_donl_field = false;
|
||||||
bool _gop_dropped = false;
|
bool _gop_dropped = false;
|
||||||
bool _fu_dropped = true;
|
bool _fu_dropped = true;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,11 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual Track::Ptr clone() = 0;
|
virtual Track::Ptr clone() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新track信息,比如触发sps/pps解析
|
||||||
|
*/
|
||||||
|
virtual bool update() { return false; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成sdp
|
* 生成sdp
|
||||||
* @return sdp对象
|
* @return sdp对象
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ void HttpClient::sendRequest(const string &url) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!alive() || host_changed) {
|
if (!alive() || host_changed) {
|
||||||
startConnect(host, port, _wait_header_ms);
|
startConnect(host, port, _wait_header_ms / 1000.0f);
|
||||||
} else {
|
} else {
|
||||||
SockException ex;
|
SockException ex;
|
||||||
onConnect_l(ex);
|
onConnect_l(ex);
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ void PlayerProxy::setTranslationInfo()
|
||||||
_transtalion_info.stream_info.clear();
|
_transtalion_info.stream_info.clear();
|
||||||
auto tracks = _muxer->getTracks();
|
auto tracks = _muxer->getTracks();
|
||||||
for (auto &track : tracks) {
|
for (auto &track : tracks) {
|
||||||
|
track->update();
|
||||||
_transtalion_info.stream_info.emplace_back();
|
_transtalion_info.stream_info.emplace_back();
|
||||||
auto &back = _transtalion_info.stream_info.back();
|
auto &back = _transtalion_info.stream_info.back();
|
||||||
back.bitrate = track->getBitRate();
|
back.bitrate = track->getBitRate();
|
||||||
|
|
|
||||||
|
|
@ -198,6 +198,7 @@ bool MP4MuxerInterface::addTrack(const Track::Ptr &track) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
track->update();
|
||||||
switch (track->getCodecId()) {
|
switch (track->getCodecId()) {
|
||||||
case CodecG711A:
|
case CodecG711A:
|
||||||
case CodecG711U:
|
case CodecG711U:
|
||||||
|
|
|
||||||
|
|
@ -57,6 +57,7 @@ AudioMeta::AudioMeta(const AudioTrack::Ptr &audio) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
|
uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
|
||||||
|
track->update();
|
||||||
switch (track->getTrackType()) {
|
switch (track->getTrackType()) {
|
||||||
case TrackAudio: {
|
case TrackAudio: {
|
||||||
auto audioTrack = std::dynamic_pointer_cast<AudioTrack>(track);
|
auto audioTrack = std::dynamic_pointer_cast<AudioTrack>(track);
|
||||||
|
|
@ -115,6 +116,7 @@ uint8_t getAudioRtmpFlags(const Track::Ptr &track) {
|
||||||
|
|
||||||
void Metadata::addTrack(AMFValue &metadata, const Track::Ptr &track) {
|
void Metadata::addTrack(AMFValue &metadata, const Track::Ptr &track) {
|
||||||
Metadata::Ptr new_metadata;
|
Metadata::Ptr new_metadata;
|
||||||
|
track->update();
|
||||||
switch (track->getTrackType()) {
|
switch (track->getTrackType()) {
|
||||||
case TrackVideo: {
|
case TrackVideo: {
|
||||||
new_metadata = std::make_shared<VideoMeta>(std::dynamic_pointer_cast<VideoTrack>(track));
|
new_metadata = std::make_shared<VideoMeta>(std::dynamic_pointer_cast<VideoTrack>(track));
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue