Opened 5 years ago
#9294 new enhancement
Multi-client SRT server
| Reported by: | a_sheetov | Owned by: | |
|---|---|---|---|
| Priority: | normal | Component: | avformat |
| Version: | git-master | Keywords: | libsrt srt multi-client |
| Cc: | Blocked By: | ||
| Blocking: | Reproduced by developer: | no | |
| Analyzed by developer: | no |
Description
I’m using ffmpeg as a library from within my app. I’m currently developing an SRT server that accepts client connections and streams video to them. I compiled ffmpeg with libsrt and implemented SRT server based on a standard muxer (options: mode=listener, transtype=live).
During testing, I found two problems:
- Data transfer doesn’t start until the first client connects
- The second client can’t connect after the first one
So it looks like ffmpeg implementation of SRT server does not support multiple concurrent client connections.
I looked at the source code (libavformat/libsrt.c) and my assumptions were confirmed:
static int libsrt_listen(int eid, int fd, const struct sockaddr *addr, socklen_t addrlen, URLContext *h, int64_t timeout)
{
int ret;
int reuse = 1;
if (srt_setsockopt(fd, SOL_SOCKET, SRTO_REUSEADDR, &reuse, sizeof(reuse))) {
av_log(h, AV_LOG_WARNING, "setsockopt(SRTO_REUSEADDR) failed\n");
}
if (srt_bind(fd, addr, addrlen))
return libsrt_neterrno(h);
if (srt_listen(fd, 1))
return libsrt_neterrno(h);
ret = libsrt_network_wait_fd_timeout(h, eid, 1, timeout, &h->interrupt_callback);
if (ret < 0)
return ret;
ret = srt_accept(fd, NULL, NULL);
if (ret < 0)
return libsrt_neterrno(h);
if (libsrt_socket_nonblock(ret, 1) < 0)
av_log(h, AV_LOG_DEBUG, "libsrt_socket_nonblock failed\n");
return ret;
}
static int libsrt_setup(URLContext *h, const char *uri, int flags)
{
// ...
if (s->mode == SRT_MODE_LISTENER) {
// multi-client
ret = libsrt_listen(write_eid, fd, cur_ai->ai_addr, cur_ai->ai_addrlen, h, s->listen_timeout);
srt_epoll_release(write_eid);
if (ret < 0)
goto fail1;
srt_close(fd);
fd = ret;
}
// ...
}
After the first client connects, server socket is closed and its descriptor is replaced with the client socket descriptor.


