mirror of
https://gitee.com/xia-chu/ZLMediaKit.git
synced 2026-05-16 14:57:49 +08:00
优化精简媒体事件相关逻辑代码
Some checks are pending
Android / build (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
Docker / build (push) Waiting to run
Linux / build (push) Waiting to run
macOS / build (push) Waiting to run
Windows / build (push) Waiting to run
Some checks are pending
Android / build (push) Waiting to run
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
Docker / build (push) Waiting to run
Linux / build (push) Waiting to run
macOS / build (push) Waiting to run
Windows / build (push) Waiting to run
This commit is contained in:
parent
8b5f313284
commit
021f09e62b
@ -308,7 +308,7 @@ API_EXPORT void API_CALL mk_media_start_send_rtp2(mk_media ctx, const char *dst_
|
|||||||
auto ref = *obj;
|
auto ref = *obj;
|
||||||
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
|
std::shared_ptr<void> ptr(user_data, user_data_free ? user_data_free : [](void *) {});
|
||||||
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([args, ref, cb, ptr]() {
|
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([args, ref, cb, ptr]() {
|
||||||
ref->getChannel()->startSendRtp(MediaSource::NullMediaSource(), args, [cb, ptr](uint16_t local_port, const SockException &ex) {
|
ref->getChannel()->getMuxer(MediaSource::NullMediaSource())->startSendRtp( args, [cb, ptr](uint16_t local_port, const SockException &ex) {
|
||||||
if (cb) {
|
if (cb) {
|
||||||
cb(ptr.get(), local_port, ex.getErrCode(), ex.what());
|
cb(ptr.get(), local_port, ex.getErrCode(), ex.what());
|
||||||
}
|
}
|
||||||
@ -349,7 +349,7 @@ API_EXPORT void API_CALL mk_media_start_send_rtp4(mk_media ctx, const char *dst_
|
|||||||
std::shared_ptr<void> ptr(
|
std::shared_ptr<void> ptr(
|
||||||
user_data, user_data_free ? user_data_free : [](void *) {});
|
user_data, user_data_free ? user_data_free : [](void *) {});
|
||||||
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([args, ref, cb, ptr]() {
|
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([args, ref, cb, ptr]() {
|
||||||
ref->getChannel()->startSendRtp(MediaSource::NullMediaSource(), args, [cb, ptr](uint16_t local_port, const SockException &ex) {
|
ref->getChannel()->getMuxer(MediaSource::NullMediaSource())->startSendRtp(args, [cb, ptr](uint16_t local_port, const SockException &ex) {
|
||||||
if (cb) {
|
if (cb) {
|
||||||
cb(ptr.get(), local_port, ex.getErrCode(), ex.what());
|
cb(ptr.get(), local_port, ex.getErrCode(), ex.what());
|
||||||
}
|
}
|
||||||
@ -365,7 +365,7 @@ API_EXPORT void API_CALL mk_media_stop_send_rtp(mk_media ctx, const char *ssrc)
|
|||||||
auto ref = *obj;
|
auto ref = *obj;
|
||||||
string ssrc_str = ssrc ? ssrc : "";
|
string ssrc_str = ssrc ? ssrc : "";
|
||||||
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([ref, ssrc_str]() {
|
(*obj)->getChannel()->getOwnerPoller(MediaSource::NullMediaSource())->async([ref, ssrc_str]() {
|
||||||
ref->getChannel()->stopSendRtp(MediaSource::NullMediaSource(), ssrc_str);
|
ref->getChannel()->getMuxer(MediaSource::NullMediaSource())->stopSendRtp(ssrc_str);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -132,10 +132,10 @@ uint64_t MediaSource::getAliveSecond() const {
|
|||||||
|
|
||||||
vector<Track::Ptr> MediaSource::getTracks(bool ready) const {
|
vector<Track::Ptr> MediaSource::getTracks(bool ready) const {
|
||||||
auto listener = _listener.lock();
|
auto listener = _listener.lock();
|
||||||
if(!listener){
|
if (!listener) {
|
||||||
return vector<Track::Ptr>();
|
return vector<Track::Ptr>();
|
||||||
}
|
}
|
||||||
return listener->getMediaTracks(const_cast<MediaSource &>(*this), ready);
|
return listener->getMuxer(const_cast<MediaSource &>(*this))->getTracks(ready);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSource::setListener(const std::weak_ptr<MediaSourceEvent> &listener){
|
void MediaSource::setListener(const std::weak_ptr<MediaSourceEvent> &listener){
|
||||||
@ -277,7 +277,7 @@ bool MediaSource::setupRecord(Recorder::type type, bool start, const string &cus
|
|||||||
WarnL << "未设置MediaSource的事件监听者,setupRecord失败:" << getUrl();
|
WarnL << "未设置MediaSource的事件监听者,setupRecord失败:" << getUrl();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return listener->setupRecord(*this, type, start, custom_path, max_second);
|
return listener->getMuxer(const_cast<MediaSource &>(*this))->setupRecord(type, start, custom_path, max_second);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSource::isRecording(Recorder::type type){
|
bool MediaSource::isRecording(Recorder::type type){
|
||||||
@ -285,7 +285,7 @@ bool MediaSource::isRecording(Recorder::type type){
|
|||||||
if(!listener){
|
if(!listener){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return listener->isRecording(*this, type);
|
return listener->getMuxer(const_cast<MediaSource &>(*this))->isRecording(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaSource::startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) {
|
void MediaSource::startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) {
|
||||||
@ -294,7 +294,7 @@ void MediaSource::startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const
|
|||||||
cb(0, SockException(Err_other, "尚未设置事件监听器"));
|
cb(0, SockException(Err_other, "尚未设置事件监听器"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
return listener->startSendRtp(*this, args, cb);
|
return listener->getMuxer(const_cast<MediaSource &>(*this))->startSendRtp(args, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSource::stopSendRtp(const string &ssrc) {
|
bool MediaSource::stopSendRtp(const string &ssrc) {
|
||||||
@ -302,7 +302,7 @@ bool MediaSource::stopSendRtp(const string &ssrc) {
|
|||||||
if (!listener) {
|
if (!listener) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return listener->stopSendRtp(*this, ssrc);
|
return listener->getMuxer(const_cast<MediaSource &>(*this))->stopSendRtp(ssrc);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MAP, typename LIST, typename First, typename ...KeyTypes>
|
template<typename MAP, typename LIST, typename First, typename ...KeyTypes>
|
||||||
@ -830,46 +830,6 @@ std::shared_ptr<RtpProcess> MediaSourceEventInterceptor::getRtpProcess(MediaSour
|
|||||||
return listener->getRtpProcess(sender);
|
return listener->getRtpProcess(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediaSourceEventInterceptor::setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path, size_t max_second) {
|
|
||||||
auto listener = _listener.lock();
|
|
||||||
if (!listener) {
|
|
||||||
return MediaSourceEvent::setupRecord(sender, type, start, custom_path, max_second);
|
|
||||||
}
|
|
||||||
return listener->setupRecord(sender, type, start, custom_path, max_second);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MediaSourceEventInterceptor::isRecording(MediaSource &sender, Recorder::type type) {
|
|
||||||
auto listener = _listener.lock();
|
|
||||||
if (!listener) {
|
|
||||||
return MediaSourceEvent::isRecording(sender, type);
|
|
||||||
}
|
|
||||||
return listener->isRecording(sender, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<Track::Ptr> MediaSourceEventInterceptor::getMediaTracks(MediaSource &sender, bool trackReady) const {
|
|
||||||
auto listener = _listener.lock();
|
|
||||||
if (!listener) {
|
|
||||||
return MediaSourceEvent::getMediaTracks(sender, trackReady);
|
|
||||||
}
|
|
||||||
return listener->getMediaTracks(sender, trackReady);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MediaSourceEventInterceptor::startSendRtp(MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) {
|
|
||||||
auto listener = _listener.lock();
|
|
||||||
if (!listener) {
|
|
||||||
return MediaSourceEvent::startSendRtp(sender, args, cb);
|
|
||||||
}
|
|
||||||
listener->startSendRtp(sender, args, cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MediaSourceEventInterceptor::stopSendRtp(MediaSource &sender, const string &ssrc) {
|
|
||||||
auto listener = _listener.lock();
|
|
||||||
if (!listener) {
|
|
||||||
return MediaSourceEvent::stopSendRtp(sender, ssrc);
|
|
||||||
}
|
|
||||||
return listener->stopSendRtp(sender, ssrc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MediaSourceEventInterceptor::setDelegate(const std::weak_ptr<MediaSourceEvent> &listener) {
|
void MediaSourceEventInterceptor::setDelegate(const std::weak_ptr<MediaSourceEvent> &listener) {
|
||||||
if (listener.lock().get() == this) {
|
if (listener.lock().get() == this) {
|
||||||
throw std::invalid_argument("can not set self as a delegate");
|
throw std::invalid_argument("can not set self as a delegate");
|
||||||
|
|||||||
@ -94,17 +94,6 @@ public:
|
|||||||
// Get the current thread, this function is generally forced to overload
|
// Get the current thread, this function is generally forced to overload
|
||||||
virtual toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) { throw NotImplemented(toolkit::demangle(typeid(*this).name()) + "::getOwnerPoller not implemented"); }
|
virtual toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) { throw NotImplemented(toolkit::demangle(typeid(*this).name()) + "::getOwnerPoller not implemented"); }
|
||||||
|
|
||||||
// //////////////////////仅供MultiMediaSourceMuxer对象继承//////////////////////// [AUTO-TRANSLATED:6e810d1f]
|
|
||||||
// //////////////////////Only for MultiMediaSourceMuxer object inheritance////////////////////////
|
|
||||||
// 开启或关闭录制 [AUTO-TRANSLATED:3817e390]
|
|
||||||
// Start or stop recording
|
|
||||||
virtual bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const std::string &custom_path, size_t max_second) { return false; };
|
|
||||||
// 获取录制状态 [AUTO-TRANSLATED:a0499880]
|
|
||||||
// Get recording status
|
|
||||||
virtual bool isRecording(MediaSource &sender, Recorder::type type) { return false; }
|
|
||||||
// 获取所有track相关信息 [AUTO-TRANSLATED:2141be42]
|
|
||||||
// Get all track related information
|
|
||||||
virtual std::vector<Track::Ptr> getMediaTracks(MediaSource &sender, bool trackReady = true) const { return std::vector<Track::Ptr>(); };
|
|
||||||
// 获取MultiMediaSourceMuxer对象 [AUTO-TRANSLATED:2de96d44]
|
// 获取MultiMediaSourceMuxer对象 [AUTO-TRANSLATED:2de96d44]
|
||||||
// Get MultiMediaSourceMuxer object
|
// Get MultiMediaSourceMuxer object
|
||||||
virtual std::shared_ptr<MultiMediaSourceMuxer> getMuxer(MediaSource &sender) const { return nullptr; }
|
virtual std::shared_ptr<MultiMediaSourceMuxer> getMuxer(MediaSource &sender) const { return nullptr; }
|
||||||
@ -180,13 +169,6 @@ public:
|
|||||||
bool enable_origin_recv_limit = false;
|
bool enable_origin_recv_limit = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 开始发送ps-rtp [AUTO-TRANSLATED:a51796fa]
|
|
||||||
// Start sending ps-rtp
|
|
||||||
virtual void startSendRtp(MediaSource &sender, const SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) { cb(0, toolkit::SockException(toolkit::Err_other, "not implemented"));};
|
|
||||||
// 停止发送ps-rtp [AUTO-TRANSLATED:952d2b35]
|
|
||||||
// Stop sending ps-rtp
|
|
||||||
virtual bool stopSendRtp(MediaSource &sender, const std::string &ssrc) {return false; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
toolkit::Timer::Ptr _async_close_timer;
|
toolkit::Timer::Ptr _async_close_timer;
|
||||||
};
|
};
|
||||||
@ -362,11 +344,6 @@ public:
|
|||||||
int totalReaderCount(MediaSource &sender) override;
|
int totalReaderCount(MediaSource &sender) override;
|
||||||
void onReaderChanged(MediaSource &sender, int size) override;
|
void onReaderChanged(MediaSource &sender, int size) override;
|
||||||
void onRegist(MediaSource &sender, bool regist) override;
|
void onRegist(MediaSource &sender, bool regist) override;
|
||||||
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const std::string &custom_path, size_t max_second) override;
|
|
||||||
bool isRecording(MediaSource &sender, Recorder::type type) override;
|
|
||||||
std::vector<Track::Ptr> getMediaTracks(MediaSource &sender, bool trackReady = true) const override;
|
|
||||||
void startSendRtp(MediaSource &sender, const SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) override;
|
|
||||||
bool stopSendRtp(MediaSource &sender, const std::string &ssrc) override;
|
|
||||||
float getLossRate(MediaSource &sender, TrackType type) override;
|
float getLossRate(MediaSource &sender, TrackType type) override;
|
||||||
toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) override;
|
toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) override;
|
||||||
std::shared_ptr<MultiMediaSourceMuxer> getMuxer(MediaSource &sender) const override;
|
std::shared_ptr<MultiMediaSourceMuxer> getMuxer(MediaSource &sender) const override;
|
||||||
|
|||||||
@ -135,8 +135,8 @@ private:
|
|||||||
std::multimap<uint64_t, Frame::Ptr> _cache;
|
std::multimap<uint64_t, Frame::Ptr> _cache;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::shared_ptr<MediaSinkInterface> MultiMediaSourceMuxer::makeRecorder(MediaSource &sender, Recorder::type type) {
|
std::shared_ptr<MediaSinkInterface> MultiMediaSourceMuxer::makeRecorder(Recorder::type type) {
|
||||||
auto recorder = Recorder::createRecorder(type, sender.getMediaTuple(), _option);
|
auto recorder = Recorder::createRecorder(type, getMediaTuple(), _option);
|
||||||
for (auto &track : getTracks()) {
|
for (auto &track : getTracks()) {
|
||||||
recorder->addTrack(track);
|
recorder->addTrack(track);
|
||||||
}
|
}
|
||||||
@ -311,13 +311,13 @@ int MultiMediaSourceMuxer::totalReaderCount(MediaSource &sender) {
|
|||||||
|
|
||||||
// 此函数可能跨线程调用 [AUTO-TRANSLATED:e8c5f74d]
|
// 此函数可能跨线程调用 [AUTO-TRANSLATED:e8c5f74d]
|
||||||
// This function may be called across threads
|
// This function may be called across threads
|
||||||
bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type, bool start, const string &custom_path, size_t max_second) {
|
bool MultiMediaSourceMuxer::setupRecord(Recorder::type type, bool start, const string &custom_path, size_t max_second) {
|
||||||
CHECK(getOwnerPoller(MediaSource::NullMediaSource())->isCurrentThread(), "Can only call setupRecord in it's owner poller");
|
CHECK(getOwnerPoller(MediaSource::NullMediaSource())->isCurrentThread(), "Can only call setupRecord in it's owner poller");
|
||||||
onceToken token(nullptr, [&]() {
|
onceToken token(nullptr, [&]() {
|
||||||
if (_option.mp4_as_player && type == Recorder::type_mp4) {
|
if (_option.mp4_as_player && type == Recorder::type_mp4) {
|
||||||
// 开启关闭mp4录制,触发观看人数变化相关事件 [AUTO-TRANSLATED:b63a8deb]
|
// 开启关闭mp4录制,触发观看人数变化相关事件 [AUTO-TRANSLATED:b63a8deb]
|
||||||
// Turn on/off mp4 recording, trigger events related to changes in the number of viewers
|
// Turn on/off mp4 recording, trigger events related to changes in the number of viewers
|
||||||
onReaderChanged(sender, totalReaderCount());
|
onReaderChanged(MediaSource::NullMediaSource(), totalReaderCount());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@ -326,7 +326,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
|
|||||||
// 开始录制 [AUTO-TRANSLATED:36d99250]
|
// 开始录制 [AUTO-TRANSLATED:36d99250]
|
||||||
// Start recording
|
// Start recording
|
||||||
_option.hls_save_path = custom_path;
|
_option.hls_save_path = custom_path;
|
||||||
auto hls = dynamic_pointer_cast<HlsRecorder>(makeRecorder(sender, type));
|
auto hls = dynamic_pointer_cast<HlsRecorder>(makeRecorder(type));
|
||||||
if (hls) {
|
if (hls) {
|
||||||
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
|
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
|
||||||
// Set the event listener for HlsMediaSource
|
// Set the event listener for HlsMediaSource
|
||||||
@ -346,7 +346,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
|
|||||||
// Start recording
|
// Start recording
|
||||||
_option.mp4_save_path = custom_path;
|
_option.mp4_save_path = custom_path;
|
||||||
_option.mp4_max_second = max_second;
|
_option.mp4_max_second = max_second;
|
||||||
_mp4 = makeRecorder(sender, type);
|
_mp4 = makeRecorder(type);
|
||||||
} else if (!start && _mp4) {
|
} else if (!start && _mp4) {
|
||||||
// 停止录制 [AUTO-TRANSLATED:3dee9292]
|
// 停止录制 [AUTO-TRANSLATED:3dee9292]
|
||||||
// Stop recording
|
// Stop recording
|
||||||
@ -359,7 +359,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
|
|||||||
// 开始录制 [AUTO-TRANSLATED:36d99250]
|
// 开始录制 [AUTO-TRANSLATED:36d99250]
|
||||||
// Start recording
|
// Start recording
|
||||||
_option.hls_save_path = custom_path;
|
_option.hls_save_path = custom_path;
|
||||||
auto hls = dynamic_pointer_cast<HlsFMP4Recorder>(makeRecorder(sender, type));
|
auto hls = dynamic_pointer_cast<HlsFMP4Recorder>(makeRecorder(type));
|
||||||
if (hls) {
|
if (hls) {
|
||||||
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
|
// 设置HlsMediaSource的事件监听器 [AUTO-TRANSLATED:69990c92]
|
||||||
// Set the event listener for HlsMediaSource
|
// Set the event listener for HlsMediaSource
|
||||||
@ -375,7 +375,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
|
|||||||
}
|
}
|
||||||
case Recorder::type_fmp4: {
|
case Recorder::type_fmp4: {
|
||||||
if (start && !_fmp4) {
|
if (start && !_fmp4) {
|
||||||
auto fmp4 = dynamic_pointer_cast<FMP4MediaSourceMuxer>(makeRecorder(sender, type));
|
auto fmp4 = dynamic_pointer_cast<FMP4MediaSourceMuxer>(makeRecorder(type));
|
||||||
if (fmp4) {
|
if (fmp4) {
|
||||||
fmp4->setListener(shared_from_this());
|
fmp4->setListener(shared_from_this());
|
||||||
}
|
}
|
||||||
@ -387,7 +387,7 @@ bool MultiMediaSourceMuxer::setupRecord(MediaSource &sender, Recorder::type type
|
|||||||
}
|
}
|
||||||
case Recorder::type_ts: {
|
case Recorder::type_ts: {
|
||||||
if (start && !_ts) {
|
if (start && !_ts) {
|
||||||
auto ts = dynamic_pointer_cast<TSMediaSourceMuxer>(makeRecorder(sender, type));
|
auto ts = dynamic_pointer_cast<TSMediaSourceMuxer>(makeRecorder(type));
|
||||||
if (ts) {
|
if (ts) {
|
||||||
ts->setListener(shared_from_this());
|
ts->setListener(shared_from_this());
|
||||||
}
|
}
|
||||||
@ -488,7 +488,7 @@ std::string MultiMediaSourceMuxer::startRecord(const std::string &file_path, uin
|
|||||||
|
|
||||||
// 此函数可能跨线程调用 [AUTO-TRANSLATED:e8c5f74d]
|
// 此函数可能跨线程调用 [AUTO-TRANSLATED:e8c5f74d]
|
||||||
// This function may be called across threads
|
// This function may be called across threads
|
||||||
bool MultiMediaSourceMuxer::isRecording(MediaSource &sender, Recorder::type type) {
|
bool MultiMediaSourceMuxer::isRecording(Recorder::type type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Recorder::type_hls: return !!_hls;
|
case Recorder::type_hls: return !!_hls;
|
||||||
case Recorder::type_mp4: return !!_mp4;
|
case Recorder::type_mp4: return !!_mp4;
|
||||||
@ -499,7 +499,7 @@ bool MultiMediaSourceMuxer::isRecording(MediaSource &sender, Recorder::type type
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) {
|
void MultiMediaSourceMuxer::startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) {
|
||||||
#if defined(ENABLE_RTPPROXY)
|
#if defined(ENABLE_RTPPROXY)
|
||||||
createGopCacheIfNeed(1);
|
createGopCacheIfNeed(1);
|
||||||
|
|
||||||
@ -507,7 +507,7 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE
|
|||||||
auto ssrc = args.ssrc;
|
auto ssrc = args.ssrc;
|
||||||
auto ssrc_multi_send = args.ssrc_multi_send;
|
auto ssrc_multi_send = args.ssrc_multi_send;
|
||||||
auto tracks = getTracks(false);
|
auto tracks = getTracks(false);
|
||||||
auto poller = getOwnerPoller(sender);
|
auto poller = getOwnerPoller(MediaSource::NullMediaSource());
|
||||||
auto rtp_sender = std::make_shared<RtpSender>(poller);
|
auto rtp_sender = std::make_shared<RtpSender>(poller);
|
||||||
|
|
||||||
weak_ptr<MultiMediaSourceMuxer> weak_self = shared_from_this();
|
weak_ptr<MultiMediaSourceMuxer> weak_self = shared_from_this();
|
||||||
@ -524,7 +524,7 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
rtp_sender->startSend(sender, args, [ssrc,ssrc_multi_send, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable {
|
rtp_sender->startSend(*this, args, [ssrc,ssrc_multi_send, weak_self, rtp_sender, cb, tracks, ring, poller](uint16_t local_port, const SockException &ex) mutable {
|
||||||
cb(local_port, ex);
|
cb(local_port, ex);
|
||||||
auto strong_self = weak_self.lock();
|
auto strong_self = weak_self.lock();
|
||||||
if (!strong_self || ex) {
|
if (!strong_self || ex) {
|
||||||
@ -556,7 +556,7 @@ void MultiMediaSourceMuxer::startSendRtp(MediaSource &sender, const MediaSourceE
|
|||||||
#endif//ENABLE_RTPPROXY
|
#endif//ENABLE_RTPPROXY
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MultiMediaSourceMuxer::stopSendRtp(MediaSource &sender, const string &ssrc) {
|
bool MultiMediaSourceMuxer::stopSendRtp(const string &ssrc) {
|
||||||
#if defined(ENABLE_RTPPROXY)
|
#if defined(ENABLE_RTPPROXY)
|
||||||
if (ssrc.empty()) {
|
if (ssrc.empty()) {
|
||||||
// 关闭全部 [AUTO-TRANSLATED:ffaadfda]
|
// 关闭全部 [AUTO-TRANSLATED:ffaadfda]
|
||||||
@ -573,10 +573,6 @@ bool MultiMediaSourceMuxer::stopSendRtp(MediaSource &sender, const string &ssrc)
|
|||||||
#endif//ENABLE_RTPPROXY
|
#endif//ENABLE_RTPPROXY
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Track::Ptr> MultiMediaSourceMuxer::getMediaTracks(MediaSource &sender, bool trackReady) const {
|
|
||||||
return getTracks(trackReady);
|
|
||||||
}
|
|
||||||
|
|
||||||
EventPoller::Ptr MultiMediaSourceMuxer::getOwnerPoller(MediaSource &sender) {
|
EventPoller::Ptr MultiMediaSourceMuxer::getOwnerPoller(MediaSource &sender) {
|
||||||
auto listener = getDelegate();
|
auto listener = getDelegate();
|
||||||
if (!listener) {
|
if (!listener) {
|
||||||
|
|||||||
@ -120,7 +120,7 @@ public:
|
|||||||
|
|
||||||
* [AUTO-TRANSLATED:cb1fd8a9]
|
* [AUTO-TRANSLATED:cb1fd8a9]
|
||||||
*/
|
*/
|
||||||
bool setupRecord(MediaSource &sender, Recorder::type type, bool start, const std::string &custom_path, size_t max_second) override;
|
bool setupRecord(Recorder::type type, bool start, const std::string &custom_path, size_t max_second);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始录制mp4
|
* 开始录制mp4
|
||||||
@ -141,25 +141,13 @@ public:
|
|||||||
|
|
||||||
* [AUTO-TRANSLATED:798afa71]
|
* [AUTO-TRANSLATED:798afa71]
|
||||||
*/
|
*/
|
||||||
bool isRecording(MediaSource &sender, Recorder::type type) override;
|
bool isRecording(Recorder::type type);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始发送ps-rtp流
|
* 开始发送ps-rtp流
|
||||||
* @param dst_url 目标ip或域名
|
|
||||||
* @param dst_port 目标端口
|
|
||||||
* @param ssrc rtp的ssrc
|
|
||||||
* @param is_udp 是否为udp
|
|
||||||
* @param cb 启动成功或失败回调
|
* @param cb 启动成功或失败回调
|
||||||
* Start sending ps-rtp stream
|
|
||||||
* @param dst_url Target ip or domain name
|
|
||||||
* @param dst_port Target port
|
|
||||||
* @param ssrc rtp's ssrc
|
|
||||||
* @param is_udp Whether it is udp
|
|
||||||
* @param cb Start success or failure callback
|
|
||||||
|
|
||||||
* [AUTO-TRANSLATED:620416c2]
|
|
||||||
*/
|
*/
|
||||||
void startSendRtp(MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb) override;
|
void startSendRtp(const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t, const toolkit::SockException &)> cb);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 停止ps-rtp发送
|
* 停止ps-rtp发送
|
||||||
@ -169,19 +157,7 @@ public:
|
|||||||
|
|
||||||
* [AUTO-TRANSLATED:b91e2055]
|
* [AUTO-TRANSLATED:b91e2055]
|
||||||
*/
|
*/
|
||||||
bool stopSendRtp(MediaSource &sender, const std::string &ssrc) override;
|
bool stopSendRtp(const std::string &ssrc);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取所有Track
|
|
||||||
* @param trackReady 是否筛选过滤未就绪的track
|
|
||||||
* @return 所有Track
|
|
||||||
* Get all Tracks
|
|
||||||
* @param trackReady Whether to filter out unready tracks
|
|
||||||
* @return All Tracks
|
|
||||||
|
|
||||||
* [AUTO-TRANSLATED:53755f5d]
|
|
||||||
*/
|
|
||||||
std::vector<Track::Ptr> getMediaTracks(MediaSource &sender, bool trackReady = true) const override;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取所属线程
|
* 获取所属线程
|
||||||
@ -247,7 +223,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void createGopCacheIfNeed(size_t gop_count);
|
void createGopCacheIfNeed(size_t gop_count);
|
||||||
std::shared_ptr<MediaSinkInterface> makeRecorder(MediaSource &sender, Recorder::type type);
|
std::shared_ptr<MediaSinkInterface> makeRecorder(Recorder::type type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool _is_enable = false;
|
bool _is_enable = false;
|
||||||
|
|||||||
@ -35,8 +35,8 @@ RtpSender::~RtpSender() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RtpSender::startSend(const MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const function<void(uint16_t local_port, const SockException &ex)> &cb){
|
void RtpSender::startSend(const MediaSourceEvent &sender, const MediaSourceEvent::SendRtpArgs &args, const function<void(uint16_t local_port, const SockException &ex)> &cb){
|
||||||
auto origin_socket = sender.getOriginSock();
|
auto origin_socket = sender.getOriginSock(MediaSource::NullMediaSource());
|
||||||
_origin_socket = dynamic_pointer_cast<Socket>(origin_socket);
|
_origin_socket = dynamic_pointer_cast<Socket>(origin_socket);
|
||||||
if (!_origin_socket) {
|
if (!_origin_socket) {
|
||||||
auto process = dynamic_pointer_cast<RtpProcess>(origin_socket);
|
auto process = dynamic_pointer_cast<RtpProcess>(origin_socket);
|
||||||
|
|||||||
@ -40,7 +40,7 @@ public:
|
|||||||
|
|
||||||
* [AUTO-TRANSLATED:c31bd9b3]
|
* [AUTO-TRANSLATED:c31bd9b3]
|
||||||
*/
|
*/
|
||||||
void startSend(const MediaSource &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t local_port, const toolkit::SockException &ex)> &cb);
|
void startSend(const MediaSourceEvent &sender, const MediaSourceEvent::SendRtpArgs &args, const std::function<void(uint16_t local_port, const toolkit::SockException &ex)> &cb);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 输入帧数据
|
* 输入帧数据
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user