关闭转协议后,将关闭解复用以提供性能
This commit is contained in:
parent
0270057907
commit
3630839bc9
|
|
@ -22,17 +22,21 @@ MultiMuxerPrivate::MultiMuxerPrivate(const string &vhost,
|
||||||
bool enable_mp4) {
|
bool enable_mp4) {
|
||||||
if (enable_rtmp) {
|
if (enable_rtmp) {
|
||||||
_rtmp = std::make_shared<RtmpMediaSourceMuxer>(vhost, app, stream, std::make_shared<TitleMeta>(dur_sec));
|
_rtmp = std::make_shared<RtmpMediaSourceMuxer>(vhost, app, stream, std::make_shared<TitleMeta>(dur_sec));
|
||||||
|
_enable_rtxp = true;
|
||||||
}
|
}
|
||||||
if (enable_rtsp) {
|
if (enable_rtsp) {
|
||||||
_rtsp = std::make_shared<RtspMediaSourceMuxer>(vhost, app, stream, std::make_shared<TitleSdp>(dur_sec));
|
_rtsp = std::make_shared<RtspMediaSourceMuxer>(vhost, app, stream, std::make_shared<TitleSdp>(dur_sec));
|
||||||
|
_enable_rtxp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enable_hls) {
|
if (enable_hls) {
|
||||||
_hls = Recorder::createRecorder(Recorder::type_hls, vhost, app, stream);
|
_hls = Recorder::createRecorder(Recorder::type_hls, vhost, app, stream);
|
||||||
|
_enable_record = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enable_mp4) {
|
if (enable_mp4) {
|
||||||
_mp4 = Recorder::createRecorder(Recorder::type_mp4, vhost, app, stream);
|
_mp4 = Recorder::createRecorder(Recorder::type_mp4, vhost, app, stream);
|
||||||
|
_enable_record = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -102,6 +106,7 @@ bool MultiMuxerPrivate::setupRecord(MediaSource &sender, Recorder::type type, bo
|
||||||
//停止录制
|
//停止录制
|
||||||
_hls = nullptr;
|
_hls = nullptr;
|
||||||
}
|
}
|
||||||
|
_enable_record = _hls || _mp4;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case Recorder::type_mp4 : {
|
case Recorder::type_mp4 : {
|
||||||
|
|
@ -112,10 +117,10 @@ bool MultiMuxerPrivate::setupRecord(MediaSource &sender, Recorder::type type, bo
|
||||||
//停止录制
|
//停止录制
|
||||||
_mp4 = nullptr;
|
_mp4 = nullptr;
|
||||||
}
|
}
|
||||||
|
_enable_record = _hls || _mp4;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
default:
|
default : return false;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -163,6 +168,10 @@ void MultiMuxerPrivate::onTrackReady(const Track::Ptr &track) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MultiMuxerPrivate::isEnabled(){
|
||||||
|
return _enable_rtxp || _enable_record;
|
||||||
|
}
|
||||||
|
|
||||||
void MultiMuxerPrivate::onTrackFrame(const Frame::Ptr &frame) {
|
void MultiMuxerPrivate::onTrackFrame(const Frame::Ptr &frame) {
|
||||||
if (_rtmp) {
|
if (_rtmp) {
|
||||||
_rtmp->inputFrame(frame);
|
_rtmp->inputFrame(frame);
|
||||||
|
|
@ -293,4 +302,9 @@ void MultiMediaSourceMuxer::inputFrame(const Frame::Ptr &frame) {
|
||||||
_muxer->inputFrame(frame);
|
_muxer->inputFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MultiMediaSourceMuxer::isEnabled(){
|
||||||
|
return _muxer->isEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}//namespace mediakit
|
}//namespace mediakit
|
||||||
|
|
@ -45,6 +45,7 @@ private:
|
||||||
void setTrackListener(Listener *listener);
|
void setTrackListener(Listener *listener);
|
||||||
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path);
|
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path);
|
||||||
bool isRecording(MediaSource &sender, Recorder::type type);
|
bool isRecording(MediaSource &sender, Recorder::type type);
|
||||||
|
bool isEnabled();
|
||||||
private:
|
private:
|
||||||
void onTrackReady(const Track::Ptr & track) override;
|
void onTrackReady(const Track::Ptr & track) override;
|
||||||
void onTrackFrame(const Frame::Ptr &frame) override;
|
void onTrackFrame(const Frame::Ptr &frame) override;
|
||||||
|
|
@ -57,6 +58,8 @@ private:
|
||||||
MediaSinkInterface::Ptr _mp4;
|
MediaSinkInterface::Ptr _mp4;
|
||||||
Listener *_listener = nullptr;
|
Listener *_listener = nullptr;
|
||||||
std::weak_ptr<MediaSourceEvent> _meida_listener;
|
std::weak_ptr<MediaSourceEvent> _meida_listener;
|
||||||
|
bool _enable_rtxp = false;
|
||||||
|
bool _enable_record = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MultiMediaSourceMuxer : public MediaSourceEvent, public MediaSinkInterface, public TrackSource, public std::enable_shared_from_this<MultiMediaSourceMuxer>{
|
class MultiMediaSourceMuxer : public MediaSourceEvent, public MediaSinkInterface, public TrackSource, public std::enable_shared_from_this<MultiMediaSourceMuxer>{
|
||||||
|
|
@ -167,6 +170,11 @@ public:
|
||||||
* @param frame 帧
|
* @param frame 帧
|
||||||
*/
|
*/
|
||||||
void inputFrame(const Frame::Ptr &frame) override;
|
void inputFrame(const Frame::Ptr &frame) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断是否生效(是否正在转其他协议)
|
||||||
|
*/
|
||||||
|
bool isEnabled();
|
||||||
private:
|
private:
|
||||||
MultiMuxerPrivate::Ptr _muxer;
|
MultiMuxerPrivate::Ptr _muxer;
|
||||||
std::weak_ptr<MediaSourceEvent> _listener;
|
std::weak_ptr<MediaSourceEvent> _listener;
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,14 @@ public:
|
||||||
* 输入rtmp并解析
|
* 输入rtmp并解析
|
||||||
*/
|
*/
|
||||||
void onWrite(const RtmpPacket::Ptr &pkt,bool key_pos = true) override {
|
void onWrite(const RtmpPacket::Ptr &pkt,bool key_pos = true) override {
|
||||||
key_pos = _demuxer->inputRtmp(pkt);
|
if(_all_track_ready && !_muxer->isEnabled()){
|
||||||
|
//获取到所有Track后,并且未开启转协议,那么不需要解复用rtmp
|
||||||
|
key_pos = pkt->isVideoKeyFrame();
|
||||||
|
}else{
|
||||||
|
//需要解复用rtmp
|
||||||
|
key_pos = _demuxer->inputRtmp(pkt);
|
||||||
|
}
|
||||||
|
|
||||||
RtmpMediaSource::onWrite(pkt,key_pos);
|
RtmpMediaSource::onWrite(pkt,key_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -138,10 +145,12 @@ public:
|
||||||
*/
|
*/
|
||||||
void onAllTrackReady() override{
|
void onAllTrackReady() override{
|
||||||
setTrackSource(_muxer);
|
setTrackSource(_muxer);
|
||||||
|
_all_track_ready = true;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
RtmpDemuxer::Ptr _demuxer;
|
RtmpDemuxer::Ptr _demuxer;
|
||||||
MultiMediaSourceMuxer::Ptr _muxer;
|
MultiMediaSourceMuxer::Ptr _muxer;
|
||||||
|
bool _all_track_ready = false;
|
||||||
};
|
};
|
||||||
} /* namespace mediakit */
|
} /* namespace mediakit */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,14 @@ public:
|
||||||
* 输入rtp并解析
|
* 输入rtp并解析
|
||||||
*/
|
*/
|
||||||
void onWrite(const RtpPacket::Ptr &rtp, bool key_pos) override {
|
void onWrite(const RtpPacket::Ptr &rtp, bool key_pos) override {
|
||||||
key_pos = _demuxer->inputRtp(rtp);
|
if(_all_track_ready && !_muxer->isEnabled()){
|
||||||
|
//获取到所有Track后,并且未开启转协议,那么不需要解复用rtp
|
||||||
|
//在关闭rtp解复用后,无法知道是否为关键帧,这样会导致无法秒开,或者开播花屏
|
||||||
|
key_pos = rtp->type == TrackVideo;
|
||||||
|
}else{
|
||||||
|
//需要解复用rtp
|
||||||
|
key_pos = _demuxer->inputRtp(rtp);
|
||||||
|
}
|
||||||
RtspMediaSource::onWrite(rtp, key_pos);
|
RtspMediaSource::onWrite(rtp, key_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -129,10 +136,12 @@ public:
|
||||||
*/
|
*/
|
||||||
void onAllTrackReady() override{
|
void onAllTrackReady() override{
|
||||||
setTrackSource(_muxer);
|
setTrackSource(_muxer);
|
||||||
|
_all_track_ready = true;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
RtspDemuxer::Ptr _demuxer;
|
RtspDemuxer::Ptr _demuxer;
|
||||||
MultiMediaSourceMuxer::Ptr _muxer;
|
MultiMediaSourceMuxer::Ptr _muxer;
|
||||||
|
bool _all_track_ready = false;
|
||||||
};
|
};
|
||||||
} /* namespace mediakit */
|
} /* namespace mediakit */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue