mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 19:00:01 +08:00
rtp发送启停支持触发观看人数统计事件
This commit is contained in:
parent
9f0c15a4f0
commit
c6a0e3ad66
@ -266,7 +266,7 @@ API_EXPORT void API_CALL mk_media_start_send_rtp(mk_media ctx, const char *dst_u
|
|||||||
args.is_udp = is_udp;
|
args.is_udp = is_udp;
|
||||||
|
|
||||||
//sender参数无用
|
//sender参数无用
|
||||||
(*obj)->getChannel()->startSendRtp(*MediaSource::NullMediaSource, args, [cb, user_data](uint16_t local_port, const SockException &ex){
|
(*obj)->getChannel()->startSendRtp(MediaSource::NullMediaSource, args, [cb, user_data](uint16_t local_port, const SockException &ex){
|
||||||
if (cb) {
|
if (cb) {
|
||||||
cb(user_data, local_port, ex.getErrCode(), ex.what());
|
cb(user_data, local_port, ex.getErrCode(), ex.what());
|
||||||
}
|
}
|
||||||
@ -277,5 +277,5 @@ API_EXPORT int API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc){
|
|||||||
assert(ctx);
|
assert(ctx);
|
||||||
MediaHelper::Ptr *obj = (MediaHelper::Ptr *) ctx;
|
MediaHelper::Ptr *obj = (MediaHelper::Ptr *) ctx;
|
||||||
//sender参数无用
|
//sender参数无用
|
||||||
return (*obj)->getChannel()->stopSendRtp(*MediaSource::NullMediaSource, ssrc ? ssrc : "");
|
return (*obj)->getChannel()->stopSendRtp(MediaSource::NullMediaSource, ssrc ? ssrc : "");
|
||||||
}
|
}
|
@ -44,15 +44,17 @@ string getOriginTypeString(MediaOriginType type){
|
|||||||
}
|
}
|
||||||
|
|
||||||
static string getOriginUrl_l(const MediaSource *thiz) {
|
static string getOriginUrl_l(const MediaSource *thiz) {
|
||||||
if (thiz == MediaSource::NullMediaSource) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return thiz->getSchema() + "://" + thiz->getVhost() + "/" + thiz->getApp() + "/" + thiz->getId();
|
return thiz->getSchema() + "://" + thiz->getVhost() + "/" + thiz->getApp() + "/" + thiz->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
struct MediaSourceNull : public MediaSource {
|
||||||
|
MediaSourceNull() : MediaSource("schema", "vhost", "app", "stream") {};
|
||||||
|
int readerCount() override { return 0; }
|
||||||
|
};
|
||||||
|
|
||||||
MediaSource * const MediaSource::NullMediaSource = nullptr;
|
static std::shared_ptr<MediaSource> s_null = std::make_shared<MediaSourceNull>();
|
||||||
|
MediaSource &MediaSource::NullMediaSource = *s_null;
|
||||||
|
|
||||||
MediaSource::MediaSource(const string &schema, const string &vhost, const string &app, const string &stream_id){
|
MediaSource::MediaSource(const string &schema, const string &vhost, const string &app, const string &stream_id){
|
||||||
GET_CONFIG(bool, enableVhost, General::kEnableVhost);
|
GET_CONFIG(bool, enableVhost, General::kEnableVhost);
|
||||||
|
@ -235,7 +235,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
class MediaSource: public TrackSource, public std::enable_shared_from_this<MediaSource> {
|
class MediaSource: public TrackSource, public std::enable_shared_from_this<MediaSource> {
|
||||||
public:
|
public:
|
||||||
static MediaSource * const NullMediaSource;
|
static MediaSource& NullMediaSource;
|
||||||
using Ptr = std::shared_ptr<MediaSource>;
|
using Ptr = std::shared_ptr<MediaSource>;
|
||||||
using StreamMap = std::unordered_map<std::string/*stream_id*/, std::weak_ptr<MediaSource> >;
|
using StreamMap = std::unordered_map<std::string/*stream_id*/, std::weak_ptr<MediaSource> >;
|
||||||
using AppStreamMap = std::unordered_map<std::string/*app*/, StreamMap>;
|
using AppStreamMap = std::unordered_map<std::string/*app*/, StreamMap>;
|
||||||
|
@ -78,7 +78,7 @@ static string getTrackInfoStr(const TrackSource *track_src){
|
|||||||
MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string &app, const string &stream, float dur_sec, const ProtocolOption &option) {
|
MultiMediaSourceMuxer::MultiMediaSourceMuxer(const string &vhost, const string &app, const string &stream, float dur_sec, const ProtocolOption &option) {
|
||||||
_option = option;
|
_option = option;
|
||||||
_get_origin_url = [this, vhost, app, stream]() {
|
_get_origin_url = [this, vhost, app, stream]() {
|
||||||
auto ret = getOriginUrl(*MediaSource::NullMediaSource);
|
auto ret = getOriginUrl(MediaSource::NullMediaSource);
|
||||||
if (!ret.empty()) {
|
if (!ret.empty()) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -237,11 +237,14 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &, const MediaSourceEvent::
|
|||||||
auto ssrc = args.ssrc;
|
auto ssrc = args.ssrc;
|
||||||
rtp_sender->setOnClose([weak_self, ssrc]() {
|
rtp_sender->setOnClose([weak_self, ssrc]() {
|
||||||
if (auto strong_self = weak_self.lock()) {
|
if (auto strong_self = weak_self.lock()) {
|
||||||
strong_self->_rtp_sender.erase(ssrc);
|
|
||||||
WarnL << "stream:" << strong_self->_get_origin_url() << " stop send rtp:" << ssrc;
|
WarnL << "stream:" << strong_self->_get_origin_url() << " stop send rtp:" << ssrc;
|
||||||
|
strong_self->_rtp_sender.erase(ssrc);
|
||||||
|
//触发观看人数统计
|
||||||
|
strong_self->onReaderChanged(MediaSource::NullMediaSource, strong_self->totalReaderCount());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
strong_self->_rtp_sender[args.ssrc] = std::move(rtp_sender);
|
strong_self->_rtp_sender[args.ssrc] = std::move(rtp_sender);
|
||||||
|
strong_self->onReaderChanged(MediaSource::NullMediaSource, strong_self->totalReaderCount());
|
||||||
});
|
});
|
||||||
#else
|
#else
|
||||||
cb(0, SockException(Err_other, "该功能未启用,编译时请打开ENABLE_RTPPROXY宏"));
|
cb(0, SockException(Err_other, "该功能未启用,编译时请打开ENABLE_RTPPROXY宏"));
|
||||||
@ -250,13 +253,10 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &, const MediaSourceEvent::
|
|||||||
|
|
||||||
bool MultiMediaSourceMuxer::stopSendRtp(MediaSource &sender, const string &ssrc) {
|
bool MultiMediaSourceMuxer::stopSendRtp(MediaSource &sender, const string &ssrc) {
|
||||||
#if defined(ENABLE_RTPPROXY)
|
#if defined(ENABLE_RTPPROXY)
|
||||||
std::unique_ptr<onceToken> token;
|
onceToken token(nullptr, [&]() {
|
||||||
if (&sender != MediaSource::NullMediaSource) {
|
//关闭rtp推流,可能触发无人观看事件
|
||||||
token.reset(new onceToken(nullptr, [&]() {
|
onReaderChanged(sender, totalReaderCount());
|
||||||
//关闭rtp推流,可能触发无人观看事件
|
});
|
||||||
MediaSourceEventInterceptor::onReaderChanged(sender, totalReaderCount());
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
if (ssrc.empty()) {
|
if (ssrc.empty()) {
|
||||||
//关闭全部
|
//关闭全部
|
||||||
auto size = _rtp_sender.size();
|
auto size = _rtp_sender.size();
|
||||||
|
Loading…
Reference in New Issue
Block a user