新增webrtc播放器datachannel消息广播机制和接口

This commit is contained in:
xia-chu 2023-09-02 12:53:56 +08:00
parent 39dd886ec1
commit e3e7495c90
7 changed files with 52 additions and 1 deletions

@ -1 +1 @@
Subproject commit 97f9b9a2ac58353f72f085830690d27833b8ad88 Subproject commit 5d74e09b8c84cccc46036ed2ef1a62f670c423d4

View File

@ -816,6 +816,19 @@ void installWebApi() {
}); });
}); });
api_regist("/index/api/broadcastMessage", [](API_ARGS_MAP) {
CHECK_SECRET();
CHECK_ARGS("schema", "vhost", "app", "stream", "msg");
auto src = MediaSource::find(allArgs["schema"], allArgs["vhost"], allArgs["app"], allArgs["stream"]);
if (!src) {
throw ApiRetException("can not find the stream", API::NotFound);
}
Any any;
Buffer::Ptr buffer = std::make_shared<BufferLikeString>(allArgs["msg"]);
any.set(std::move(buffer));
src->broadcastMessage(any);
});
//测试url http://127.0.0.1/index/api/getMediaInfo?schema=rtsp&vhost=__defaultVhost__&app=live&stream=obs //测试url http://127.0.0.1/index/api/getMediaInfo?schema=rtsp&vhost=__defaultVhost__&app=live&stream=obs
api_regist("/index/api/getMediaInfo",[](API_ARGS_MAP_ASYNC){ api_regist("/index/api/getMediaInfo",[](API_ARGS_MAP_ASYNC){
CHECK_SECRET(); CHECK_SECRET();

View File

@ -353,6 +353,8 @@ public:
cb(std::list<toolkit::Any>()); cb(std::list<toolkit::Any>());
} }
virtual bool broadcastMessage(const toolkit::Any &data) { return false; }
// 获取媒体源类型 // 获取媒体源类型
MediaOriginType getOriginType() const; MediaOriginType getOriginType() const;
// 获取媒体源url或者文件路径 // 获取媒体源url或者文件路径

View File

@ -55,9 +55,16 @@ public:
void getPlayerList(const std::function<void(const std::list<toolkit::Any> &info_list)> &cb, void getPlayerList(const std::function<void(const std::list<toolkit::Any> &info_list)> &cb,
const std::function<toolkit::Any(toolkit::Any &&info)> &on_change) override { const std::function<toolkit::Any(toolkit::Any &&info)> &on_change) override {
assert(_ring);
_ring->getInfoList(cb, on_change); _ring->getInfoList(cb, on_change);
} }
bool broadcastMessage(const toolkit::Any &data) override {
assert(_ring);
_ring->sendMessage(data);
return true;
}
/** /**
* *
*/ */

View File

@ -71,6 +71,21 @@ void WebRtcPlayer::onStartWebRTC() {
} }
strong_self->onShutdown(SockException(Err_shutdown, "rtsp ring buffer detached")); strong_self->onShutdown(SockException(Err_shutdown, "rtsp ring buffer detached"));
}); });
_reader->setMessageCB([weak_self] (const toolkit::Any &data) {
auto strong_self = weak_self.lock();
if (!strong_self) {
return;
}
if (data.is<Buffer>()) {
auto &buffer = data.get<Buffer>();
// PPID 51: 文本string
// PPID 53: 二进制
strong_self->sendDatachannel(0, 51, buffer.data(), buffer.size());
} else {
WarnL << "Send unknown message type to webrtc player: " << data.type_name();
}
});
} }
} }
void WebRtcPlayer::onDestory() { void WebRtcPlayer::onDestory() {

View File

@ -229,6 +229,19 @@ void WebRtcTransport::OnSctpAssociationMessageReceived(
_sctp->SendSctpMessage(params, ppid, msg, len); _sctp->SendSctpMessage(params, ppid, msg, len);
} }
#endif #endif
void WebRtcTransport::sendDatachannel(uint16_t streamId, uint32_t ppid, const char *msg, size_t len) {
#ifdef ENABLE_SCTP
if (_sctp) {
RTC::SctpStreamParameters params;
params.streamId = streamId;
_sctp->SendSctpMessage(params, ppid, (uint8_t *)msg, len);
}
#else
WarnL << "WebRTC datachannel disabled!";
#endif
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void WebRtcTransport::sendSockData(const char *buf, size_t len, RTC::TransportTuple *tuple) { void WebRtcTransport::sendSockData(const char *buf, size_t len, RTC::TransportTuple *tuple) {

View File

@ -112,6 +112,7 @@ public:
*/ */
void sendRtpPacket(const char *buf, int len, bool flush, void *ctx = nullptr); void sendRtpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
void sendRtcpPacket(const char *buf, int len, bool flush, void *ctx = nullptr); void sendRtcpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
void sendDatachannel(uint16_t streamId, uint32_t ppid, const char *msg, size_t len);
const EventPoller::Ptr& getPoller() const; const EventPoller::Ptr& getPoller() const;
Session::Ptr getSession() const; Session::Ptr getSession() const;