完善GB28181推流

This commit is contained in:
xiongziliang
2020-07-08 09:36:10 +08:00
parent 477f99b756
commit 248b2d5cb9
6 changed files with 74 additions and 21 deletions

View File

@@ -17,25 +17,20 @@ RtpServer::RtpServer() {
}
RtpServer::~RtpServer() {
if(_udp_server){
_udp_server->setOnRead(nullptr);
if(_on_clearup){
_on_clearup();
}
}
void RtpServer::start(uint16_t local_port, const string &stream_id, bool enable_tcp, const char *local_ip) {
_udp_server.reset(new Socket(nullptr, false));
auto &ref = RtpSelector::Instance();
auto sock = _udp_server;
_udp_server->setOnRead([&ref, sock, stream_id](const Buffer::Ptr &buf, struct sockaddr *addr, int) {
ref.inputRtp(sock, const_cast<string &>(stream_id), buf->data(), buf->size(), addr);
});
//创建udp服务器
if (!_udp_server->bindUdpSock(local_port, local_ip)) {
_udp_server = nullptr;
string err = (StrPrinter << "bindUdpSock on " << local_ip << ":" << local_port << " failed:" << get_uv_errmsg(true));
throw std::runtime_error(err);
}
//设置udp socket读缓存
SockUtil::setRecvBuf(_udp_server->rawFD(), 4 * 1024 * 1024);
@@ -51,6 +46,31 @@ void RtpServer::start(uint16_t local_port, const string &stream_id, bool enable
throw;
}
}
auto sock = _udp_server;
RtpProcess::Ptr process;
if (!stream_id.empty()) {
//指定了流id那么一个端口一个流(不管是否包含多个ssrc的多个流绑定rtp源后会筛选掉ip端口不匹配的流)
process = RtpSelector::Instance().getProcess(stream_id, true);
_udp_server->setOnRead([sock, process](const Buffer::Ptr &buf, struct sockaddr *addr, int) {
process->inputRtp(sock, buf->data(), buf->size(), addr);
});
} else {
//未指定流id一个端口多个流通过ssrc来分流
auto &ref = RtpSelector::Instance();
_udp_server->setOnRead([&ref, sock](const Buffer::Ptr &buf, struct sockaddr *addr, int) {
ref.inputRtp(sock, buf->data(), buf->size(), addr);
});
}
_on_clearup = [sock, process, stream_id]() {
//去除循环引用
sock->setOnRead(nullptr);
if (process) {
//删除rtp处理器
RtpSelector::Instance().delProcess(stream_id, process.get());
}
};
}
EventPoller::Ptr RtpServer::getPoller() {