Merge branch 'master' of https://gitee.com/xia-chu/ZLMediaKit into dev

This commit is contained in:
xia-chu 2021-04-20 17:58:21 +08:00
commit dc3d59952e
8 changed files with 97 additions and 41 deletions

View File

@ -13,8 +13,8 @@
//最多等待未初始化的Track 10秒超时之后会忽略未初始化的Track
#define MAX_WAIT_MS_READY 10000
//如果添加Track最多等待5秒
#define MAX_WAIT_MS_ADD_TRACK 5000
//如果直播流只有单Track最多等待3秒超时后未收到其他Track的数据则认为是单Track
#define MAX_WAIT_MS_ADD_TRACK 3000
namespace mediakit{

View File

@ -22,12 +22,10 @@ using namespace toolkit;
namespace mediakit{
class MediaSinkInterface : public FrameWriterInterface {
class TrackListener {
public:
typedef std::shared_ptr<MediaSinkInterface> Ptr;
MediaSinkInterface(){};
virtual ~MediaSinkInterface(){};
TrackListener() = default;
virtual ~TrackListener() = default;
/**
* trackTrack的clone方法
@ -37,25 +35,33 @@ public:
virtual void addTrack(const Track::Ptr & track) = 0;
/**
* Track完毕
* track完毕
*/
virtual void addTrackCompleted() {}
virtual void addTrackCompleted() {};
/**
* track
*/
virtual void resetTracks() = 0;
virtual void resetTracks() {};
};
class MediaSinkInterface : public FrameWriterInterface, public TrackListener {
public:
typedef std::shared_ptr<MediaSinkInterface> Ptr;
MediaSinkInterface() = default;
~MediaSinkInterface() override = default;
};
/**
* Track ready()true也就是就绪后再通知派生类进行下一步的操作
* Frame前由Track截取处理下便sps pps aa_cfg
*/
class MediaSink : public MediaSinkInterface , public TrackSource{
class MediaSink : public MediaSinkInterface, public TrackSource{
public:
typedef std::shared_ptr<MediaSink> Ptr;
MediaSink(){}
virtual ~MediaSink(){}
MediaSink() = default;
~MediaSink() override = default;
/**
* frame
@ -86,7 +92,8 @@ public:
* Track
* @param trackReady Track
*/
vector<Track::Ptr> getTracks(bool trackReady = true) const override ;
vector<Track::Ptr> getTracks(bool trackReady = true) const override;
protected:
/**
* track已经准备好ready()true
@ -105,6 +112,7 @@ protected:
* @param frame
*/
virtual void onTrackFrame(const Frame::Ptr &frame) {};
private:
/**
* onAllTrackReady事件
@ -116,6 +124,7 @@ private:
*/
void checkTrackIfReady(const Track::Ptr &track);
void checkTrackIfReady_l(const Track::Ptr &track);
private:
bool _all_track_ready = false;
size_t _max_track_size = 2;

View File

@ -106,13 +106,25 @@ float Demuxer::getDuration() const {
return _fDuration;
}
void Demuxer::onAddTrack(const Track::Ptr &track){
void Demuxer::addTrack(const Track::Ptr &track){
if(_listener){
_listener->onAddTrack(track);
_listener->addTrack(track);
}
}
void Demuxer::setTrackListener(Demuxer::Listener *listener) {
void Demuxer::addTrackCompleted(){
if(_listener){
_listener->addTrackCompleted();
}
}
void Demuxer::resetTracks() {
if (_listener) {
_listener->resetTracks();
}
}
void Demuxer::setTrackListener(TrackListener *listener) {
_listener = listener;
}

View File

@ -19,6 +19,7 @@
#include "Util/mini.h"
#include "Util/RingBuffer.h"
#include "Common/MediaSource.h"
#include "Common/MediaSink.h"
#include "Extension/Frame.h"
#include "Extension/Track.h"
using namespace toolkit;
@ -227,18 +228,10 @@ protected:
MediaSource::Ptr _pMediaSrc;
};
class Demuxer : public PlayerBase{
class Demuxer : public PlayerBase, public TrackListener{
public:
class Listener{
public:
Listener() = default;
virtual ~Listener() = default;
virtual void onAddTrack(const Track::Ptr &track) = 0;
};
Demuxer(){};
virtual ~Demuxer(){};
Demuxer() = default;
~Demuxer() override = default;
/**
*
@ -267,15 +260,19 @@ public:
/**
* track监听器
*/
void setTrackListener(Listener *listener);
void setTrackListener(TrackListener *listener);
protected:
void onAddTrack(const Track::Ptr &track);
void addTrack(const Track::Ptr &track) override;
void addTrackCompleted() override;
void resetTracks() override;
protected:
Listener *_listener = nullptr;
float _fDuration = 0;
Ticker _ticker;
AudioTrack::Ptr _audioTrack;
VideoTrack::Ptr _videoTrack;
Ticker _ticker;
float _fDuration = 0;
TrackListener *_listener = nullptr;
};
} /* namespace mediakit */

View File

@ -72,6 +72,11 @@ bool RtmpDemuxer::loadMetaData(const AMFValue &val){
} catch (std::exception &ex) {
WarnL << ex.what();
}
if (ret) {
//metadata中存在track相关的描述那么我们根据metadata判断有多少个track
addTrackCompleted();
}
return ret;
}
@ -114,7 +119,7 @@ void RtmpDemuxer::makeVideoTrack(const AMFValue &videoCodec, int bit_rate) {
if (_video_rtmp_decoder) {
//设置rtmp解码器代理生成的frame写入该Track
_video_rtmp_decoder->addDelegate(_videoTrack);
onAddTrack(_videoTrack);
addTrack(_videoTrack);
_try_get_video_track = true;
} else {
//找不到相应的rtmp解码器该track无效
@ -133,7 +138,7 @@ void RtmpDemuxer::makeAudioTrack(const AMFValue &audioCodec,int sample_rate, int
if (_audio_rtmp_decoder) {
//设置rtmp解码器代理生成的frame写入该Track
_audio_rtmp_decoder->addDelegate(_audioTrack);
onAddTrack(_audioTrack);
addTrack(_audioTrack);
_try_get_audio_track = true;
} else {
//找不到相应的rtmp解码器该track无效

View File

@ -27,7 +27,7 @@ using namespace std;
using namespace toolkit;
namespace mediakit {
class RtmpMediaSourceImp: public RtmpMediaSource, public Demuxer::Listener , public MultiMediaSourceMuxer::Listener {
class RtmpMediaSourceImp: public RtmpMediaSource, public TrackListener , public MultiMediaSourceMuxer::Listener {
public:
typedef std::shared_ptr<RtmpMediaSourceImp> Ptr;
@ -97,13 +97,28 @@ public:
/**
* _demuxer触发的添加Track事件
*/
void onAddTrack(const Track::Ptr &track) override {
void addTrack(const Track::Ptr &track) override {
if(_muxer){
_muxer->addTrack(track);
track->addDelegate(_muxer);
}
}
/**
* _demuxer触发的Track添加完毕事件
*/
void addTrackCompleted() override {
if (_muxer) {
_muxer->addTrackCompleted();
}
}
void resetTracks() override {
if (_muxer) {
_muxer->resetTracks();
}
}
/**
* _muxer触发的所有Track就绪的事件
*/

View File

@ -38,6 +38,9 @@ void RtspDemuxer::loadSdp(const SdpParser &attr) {
break;
}
}
//rtsp能通过sdp立即知道有多少个track
addTrackCompleted();
auto titleTrack = attr.getTrack(TrackTitle);
if(titleTrack){
_fDuration = titleTrack->_duration;
@ -83,7 +86,7 @@ void RtspDemuxer::makeAudioTrack(const SdpTrack::Ptr &audio) {
if(_audioRtpDecoder){
//设置rtp解码器代理生成的frame写入该Track
_audioRtpDecoder->addDelegate(_audioTrack);
onAddTrack(_audioTrack);
addTrack(_audioTrack);
} else{
//找不到相应的rtp解码器该track无效
_audioTrack.reset();
@ -101,7 +104,7 @@ void RtspDemuxer::makeVideoTrack(const SdpTrack::Ptr &video) {
if(_videoRtpDecoder){
//设置rtp解码器代理生成的frame写入该Track
_videoRtpDecoder->addDelegate(_videoTrack);
onAddTrack(_videoTrack);
addTrack(_videoTrack);
}else{
//找不到相应的rtp解码器该track无效
_videoTrack.reset();

View File

@ -18,7 +18,7 @@
using namespace toolkit;
namespace mediakit {
class RtspMediaSourceImp : public RtspMediaSource, public Demuxer::Listener , public MultiMediaSourceMuxer::Listener {
class RtspMediaSourceImp : public RtspMediaSource, public TrackListener, public MultiMediaSourceMuxer::Listener {
public:
typedef std::shared_ptr<RtspMediaSourceImp> Ptr;
@ -94,13 +94,28 @@ public:
/**
* _demuxer触发的添加Track事件
*/
void onAddTrack(const Track::Ptr &track) override {
void addTrack(const Track::Ptr &track) override {
if(_muxer){
_muxer->addTrack(track);
track->addDelegate(_muxer);
}
}
/**
* _demuxer触发的Track添加完毕事件
*/
void addTrackCompleted() override {
if (_muxer) {
_muxer->addTrackCompleted();
}
}
void resetTracks() override {
if (_muxer) {
_muxer->resetTracks();
}
}
/**
* _muxer触发的所有Track就绪的事件
*/