1.检测到有用户推流过来调用
srs_app_listener.cpp
st_netfd_t client_stfd = st_accept(_stfd, NULL, NULL, ST_UTIME_NO_TIMEOUT);
srs_app_server.cpp
int SrsStreamListener::on_tcp_client(st_netfd_t stfd)
srs_app_rtmp_conn.cpp
int SrsRtmpConn::stream_service_cycle()
case SrsRtmpConnFMLEPublish: {
return publishing(source);
int SrsRtmpConn::publishing(SrsSource* source)//可以获取到推流地址等信息
if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) { //可以检测是否为有效的地址
ret = do_publishing(source, &trd);
2.推rtmp流主动断开连接,停止推流
srs_app_thread.cpp
void* SrsThread::thread_fun(void* arg)
ctx->clear_cid();
st_thread_exit(NULL);
srs_app_rtmp_conn.cpp
int SrsRtmpConn::publishing(SrsSource* source)
ret = do_publishing(source, &trd);//退出循环,继续下面的代码:trd.stop();
void SrsRtmpConn::release_publish(SrsSource* source, bool is_edge)
source->on_unpublish();
srs_app_source.cpp
void SrsSource::on_unpublish()
stat->on_stream_close(_req);
handler->on_unpublish(this, _req);
// no consumer, stream is die.
if (consumers.empty()) {
die_at = srs_get_system_time_ms();
}
3.最先获取推流地址等信息的是地方
srs_app_rtmp_conn.cpp
int SrsRtmpConn::stream_service_cycle()
SrsSource* source = NULL;
if ((ret = SrsSource::fetch_or_create(req, server, &source)) != ERROR_SUCCESS) {
source 里的_req 就有推流信息
4.观看rtmp视频用户连接到服务器的
srs_app_listener.cpp
int SrsTcpListener::cycle()
if ((ret = handler->on_tcp_client(client_stfd)) != ERROR_SUCCESS) {
int SrsRtmpConn::stream_service_cycle()
case SrsRtmpConnPlay:
ret = playing(source); 函数里里有一个do_playing(source, consumer, &trd);一直接收视频流(处于阻塞状态),当观看者断开
视频流的时候,会继续运行下面的: trd.stop();关闭视频等
5.观看rtmp视频用户,主动断开视频流的
srs_app_thread.cpp
void* SrsThread::thread_fun(void* arg)
srs_app_rtmp_conn.cpp
int SrsRtmpConn::playing(SrsSource* source)
trd.stop();
int SrsRtmpConn::stream_service_cycle()
case SrsRtmpConnPlay:
ret = playing(source);//退出循环,继续下面的代码:http_hooks_on_stop();
此时可以通过stat变量里的clients个数获取当前有几个观看者,可以获取当前stream变量里的流信息(比如视频流地址信息)
或者通过req变量获取流信息,可以通过id获取当前的编号
srs_app_thread.cpp
void* SrsThread::thread_fun(void* arg)
st_thread_exit(NULL);
6.观看rtmp视频用户断开连接,检测是否全部都断开连接,即当前没有用户观看视频
srs_app_source.cpp
void SrsSource::on_consumer_destroy(SrsConsumer* consumer)
if (consumers.empty()) { //检测当前观看用户是否为空
7.所有的连接都是往这里
srs_app_listener.cpp
int SrsTcpListener::cycle()