ZLMediaKit/src/Common/MultiMediaSourceMuxer.h

193 lines
5.7 KiB
C++
Raw Normal View History

2018-10-25 10:00:17 +08:00
/*
2020-04-04 20:30:09 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
2018-10-25 10:00:17 +08:00
*
* This file is part of ZLMediaKit(https://github.com/xiongziliang/ZLMediaKit).
*
2020-04-04 20:30:09 +08:00
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
2018-10-25 10:00:17 +08:00
*/
2018-10-24 17:17:55 +08:00
2018-10-25 16:46:00 +08:00
#ifndef ZLMEDIAKIT_MULTIMEDIASOURCEMUXER_H
#define ZLMEDIAKIT_MULTIMEDIASOURCEMUXER_H
2019-06-28 17:30:13 +08:00
#include "Rtsp/RtspMediaSourceMuxer.h"
#include "Rtmp/RtmpMediaSourceMuxer.h"
2019-12-04 10:45:38 +08:00
#include "Record/Recorder.h"
2019-12-28 18:50:56 +08:00
#include "Record/HlsMediaSource.h"
2019-12-29 10:49:04 +08:00
#include "Record/HlsRecorder.h"
2020-04-05 09:26:29 +08:00
namespace mediakit{
2018-10-24 17:17:55 +08:00
2020-04-05 09:26:29 +08:00
class MultiMuxerPrivate : public MediaSink , public std::enable_shared_from_this<MultiMuxerPrivate>{
2018-10-24 17:17:55 +08:00
public:
2020-04-05 09:26:29 +08:00
friend class MultiMediaSourceMuxer;
typedef std::shared_ptr<MultiMuxerPrivate> Ptr;
class Listener{
public:
Listener() = default;
virtual ~Listener() = default;
virtual void onAllTrackReady() = 0;
};
2020-04-05 09:26:29 +08:00
~MultiMuxerPrivate() override;
private:
MultiMuxerPrivate(const string &vhost,const string &app, const string &stream,float dur_sec,
bool enable_rtsp, bool enable_rtmp, bool enable_hls, bool enable_mp4);
2020-04-05 09:26:29 +08:00
void resetTracks() override;
void setMediaListener(const std::weak_ptr<MediaSourceEvent> &listener);
int totalReaderCount() const;
void setTimeStamp(uint32_t stamp);
void setTrackListener(Listener *listener);
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path);
bool isRecording(MediaSource &sender, Recorder::type type);
bool isEnabled();
2020-04-05 09:26:29 +08:00
void onTrackReady(const Track::Ptr & track) override;
void onTrackFrame(const Frame::Ptr &frame) override;
void onAllTrackReady() override;
MediaSource::Ptr getHlsMediaSource() const;
2020-04-05 09:26:29 +08:00
private:
RtmpMediaSourceMuxer::Ptr _rtmp;
RtspMediaSourceMuxer::Ptr _rtsp;
MediaSinkInterface::Ptr _hls;
MediaSinkInterface::Ptr _mp4;
Listener *_listener = nullptr;
std::weak_ptr<MediaSourceEvent> _meida_listener;
bool _enable_rtxp = false;
bool _enable_record = false;
2020-04-05 09:26:29 +08:00
};
2018-10-26 14:12:16 +08:00
class MultiMediaSourceMuxer : public MediaSourceEvent, public MediaSinkInterface, public TrackSource, public MultiMuxerPrivate::Listener, public std::enable_shared_from_this<MultiMediaSourceMuxer>{
2020-04-05 09:26:29 +08:00
public:
typedef MultiMuxerPrivate::Listener Listener;
typedef std::shared_ptr<MultiMediaSourceMuxer> Ptr;
2018-10-25 16:46:00 +08:00
2020-04-05 09:26:29 +08:00
~MultiMediaSourceMuxer() override;
MultiMediaSourceMuxer(const string &vhost, const string &app, const string &stream, float dur_sec = 0.0,
bool enable_rtsp = true, bool enable_rtmp = true, bool enable_hls = true, bool enable_mp4 = false);
2018-10-25 16:49:43 +08:00
/**
*
* @param listener
2018-10-25 16:49:43 +08:00
*/
2020-04-05 09:26:29 +08:00
void setMediaListener(const std::weak_ptr<MediaSourceEvent> &listener);
2018-10-26 14:12:16 +08:00
/**
* Track就绪事件监听器
* @param listener
*/
void setTrackListener(const std::weak_ptr<MultiMuxerPrivate::Listener> &listener);
2018-10-26 14:12:16 +08:00
/**
*
*/
2020-04-05 09:26:29 +08:00
int totalReaderCount() const;
/**
* MediaSource时间戳
* @param stamp
*/
void setTimeStamp(uint32_t stamp);
2019-12-03 12:32:57 +08:00
/**
2020-04-05 09:26:29 +08:00
* Track
* @param trackReady track
* @return Track
2019-12-03 12:32:57 +08:00
*/
2020-04-05 09:26:29 +08:00
vector<Track::Ptr> getTracks(bool trackReady = true) const override;
2019-12-03 12:32:57 +08:00
/**
2020-04-05 09:26:29 +08:00
*
* @param sender
* @param ui32Stamp
* @return
2019-12-03 12:32:57 +08:00
*/
2020-04-05 09:26:29 +08:00
bool seekTo(MediaSource &sender,uint32_t ui32Stamp) override;
2019-12-03 12:32:57 +08:00
/**
2020-04-05 09:26:29 +08:00
*
* @param sender
* @param force
* @return
2019-12-03 12:32:57 +08:00
*/
2020-04-05 09:26:29 +08:00
bool close(MediaSource &sender,bool force) override;
/**
*
* @param sender
* @return
*/
int totalReaderCount(MediaSource &sender) override;
/**
*
* @param sender
*/
void onNoneReader(MediaSource &sender) override;
2020-07-02 18:14:39 +08:00
/**
*
* @param sender
* @param regist
*/
void onRegist(MediaSource &sender, bool regist) override;
2020-04-05 09:26:29 +08:00
/**
*
* @param type
* @param start
* @param custom_path
* @return
*/
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path) override;
/**
*
* @param type
* @return
*/
bool isRecording(MediaSource &sender, Recorder::type type) override;
/**
* trackTrack的clone方法
* sps pps这些信息 Delegate相关关系
* @param track
2020-04-05 09:26:29 +08:00
*/
void addTrack(const Track::Ptr & track) override;
/**
* track完毕
*/
void addTrackCompleted();
/**
* track全部就绪
*/
void onAllTrackReady() override;
2020-04-05 09:26:29 +08:00
/**
* track
*/
void resetTracks() override;
/**
*
* @param frame
*/
void inputFrame(const Frame::Ptr &frame) override;
/**
* ()
*/
bool isEnabled();
2018-10-24 17:17:55 +08:00
private:
2020-04-05 09:26:29 +08:00
MultiMuxerPrivate::Ptr _muxer;
std::weak_ptr<MediaSourceEvent> _listener;
std::weak_ptr<MultiMuxerPrivate::Listener> _track_listener;
2020-05-25 12:07:38 +08:00
Stamp _stamp[2];
2018-10-24 17:17:55 +08:00
};
2020-04-05 09:26:29 +08:00
}//namespace mediakit
2018-10-25 16:46:00 +08:00
#endif //ZLMEDIAKIT_MULTIMEDIASOURCEMUXER_H