srs 推流者、观看者在连接、断开的代码跟踪分析

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值