MultiMediaSourceMuxer支持多track
This commit is contained in:
parent
3ca6b17718
commit
7735e6c9e3
|
|
@ -177,11 +177,7 @@ MultiMediaSourceMuxer::MultiMediaSourceMuxer(const MediaTuple& tuple, float dur_
|
||||||
_poller = EventPollerPool::Instance().getPoller();
|
_poller = EventPollerPool::Instance().getPoller();
|
||||||
_create_in_poller = _poller->isCurrentThread();
|
_create_in_poller = _poller->isCurrentThread();
|
||||||
_option = option;
|
_option = option;
|
||||||
if (dur_sec > 0.01) {
|
_dur_sec = dur_sec;
|
||||||
// 点播
|
|
||||||
_stamp[TrackVideo].setPlayBack();
|
|
||||||
_stamp[TrackAudio].setPlayBack();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (option.enable_rtmp) {
|
if (option.enable_rtmp) {
|
||||||
_rtmp = std::make_shared<RtmpMediaSourceMuxer>(_tuple, option, std::make_shared<TitleMeta>(dur_sec));
|
_rtmp = std::make_shared<RtmpMediaSourceMuxer>(_tuple, option, std::make_shared<TitleMeta>(dur_sec));
|
||||||
|
|
@ -464,6 +460,12 @@ std::shared_ptr<MultiMediaSourceMuxer> MultiMediaSourceMuxer::getMuxer(MediaSour
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MultiMediaSourceMuxer::onTrackReady(const Track::Ptr &track) {
|
bool MultiMediaSourceMuxer::onTrackReady(const Track::Ptr &track) {
|
||||||
|
auto &stamp = _stamps[track->getIndex()];
|
||||||
|
if (_dur_sec > 0.01) {
|
||||||
|
// 点播
|
||||||
|
stamp.setPlayBack();
|
||||||
|
}
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (_rtmp) {
|
if (_rtmp) {
|
||||||
ret = _rtmp->addTrack(track) ? true : ret;
|
ret = _rtmp->addTrack(track) ? true : ret;
|
||||||
|
|
@ -536,10 +538,14 @@ void MultiMediaSourceMuxer::onAllTrackReady() {
|
||||||
createGopCacheIfNeed();
|
createGopCacheIfNeed();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
auto tracks = getTracks(false);
|
|
||||||
if (tracks.size() >= 2) {
|
Stamp *first = nullptr;
|
||||||
// 音频时间戳同步于视频,因为音频时间戳被修改后不影响播放
|
for (auto &pr : _stamps) {
|
||||||
_stamp[TrackAudio].syncTo(_stamp[TrackVideo]);
|
if (!first) {
|
||||||
|
first = &pr.second;
|
||||||
|
} else {
|
||||||
|
pr.second.syncTo(*first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
InfoL << "stream: " << shortUrl() << " , codec info: " << getTrackInfoStr(this);
|
InfoL << "stream: " << shortUrl() << " , codec info: " << getTrackInfoStr(this);
|
||||||
}
|
}
|
||||||
|
|
@ -589,7 +595,7 @@ void MultiMediaSourceMuxer::resetTracks() {
|
||||||
bool MultiMediaSourceMuxer::onTrackFrame(const Frame::Ptr &frame) {
|
bool MultiMediaSourceMuxer::onTrackFrame(const Frame::Ptr &frame) {
|
||||||
if (_option.modify_stamp != ProtocolOption::kModifyStampOff) {
|
if (_option.modify_stamp != ProtocolOption::kModifyStampOff) {
|
||||||
// 时间戳不采用原始的绝对时间戳
|
// 时间戳不采用原始的绝对时间戳
|
||||||
const_cast<Frame::Ptr&>(frame) = std::make_shared<FrameStamp>(frame, _stamp[frame->getTrackType()], _option.modify_stamp);
|
const_cast<Frame::Ptr&>(frame) = std::make_shared<FrameStamp>(frame, _stamps[frame->getIndex()], _option.modify_stamp);
|
||||||
}
|
}
|
||||||
return _paced_sender ? _paced_sender->inputFrame(frame) : onTrackFrame_l(frame);
|
return _paced_sender ? _paced_sender->inputFrame(frame) : onTrackFrame_l(frame);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -162,11 +162,12 @@ private:
|
||||||
bool _is_enable = false;
|
bool _is_enable = false;
|
||||||
bool _create_in_poller = false;
|
bool _create_in_poller = false;
|
||||||
bool _video_key_pos = false;
|
bool _video_key_pos = false;
|
||||||
|
float _dur_sec;
|
||||||
std::shared_ptr<class FramePacedSender> _paced_sender;
|
std::shared_ptr<class FramePacedSender> _paced_sender;
|
||||||
MediaTuple _tuple;
|
MediaTuple _tuple;
|
||||||
ProtocolOption _option;
|
ProtocolOption _option;
|
||||||
toolkit::Ticker _last_check;
|
toolkit::Ticker _last_check;
|
||||||
Stamp _stamp[2];
|
std::unordered_map<int, Stamp> _stamps;
|
||||||
std::weak_ptr<Listener> _track_listener;
|
std::weak_ptr<Listener> _track_listener;
|
||||||
std::unordered_multimap<std::string, RingType::RingReader::Ptr> _rtp_sender;
|
std::unordered_multimap<std::string, RingType::RingReader::Ptr> _rtp_sender;
|
||||||
FMP4MediaSourceMuxer::Ptr _fmp4;
|
FMP4MediaSourceMuxer::Ptr _fmp4;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue