srs推流的流程

本文详细介绍了SRS服务器在accept请求后,如何创建SrsRtmpConn进行rtmp协议处理,包括handshake、connect、create stream等步骤。接着阐述了在判断为publish后,如何启动SrsRecvThread接收并处理推流数据,将其放入SrsConsumer队列,并通过条件变量通知消费者开始消费。整个流程涵盖了从TCP连接建立到推流数据处理的全过程。
摘要由CSDN通过智能技术生成

简述

  1. 在accept一个链接后,创建对应的SrsRtmpConn。
  2. SrsRtmpConn自身是一个协程的子类,运行后进行rtmp协议中的handshake、connect、create stream。并且判断是publish之后,创建SrsRecvThread来接受推流。
    但是有一点比较奇怪的写法就是,在handshake之后,connect之前就根据发的包内容来判断是一个publish还是play。这点和我认知的rtmp协议不同,在我的认知里面,rtmp协议在create stream会发play或者push的message表示自己是一个什么样的角色,一般都是通过这个方法来判断的。
  3. SrsRecvThread是一个协程,运行后会开始接受message数据。根据对应message执行不同的函数,并且把message放入到SrsConsumer队列中,
  4. 在放入SrsConsumer的队列中后会通过条件srs_cond_signal(mw_wait),通知等待的协程可以开始消费message了

accept请求

这个是接受tcp链接的代码,rtmp的tcp监听也是在这边的。accept一个fd后,调用on_tcp_client处理这个链接。
这边有一点需要注意的是,srs的io操作大部分是state thread库函数做的。调用accept的socket是一个非阻塞式的,但是st_accept用起来像阻塞式的,实际上是一个非阻塞式的。

srs_error_t SrsTcpListener::cycle()
{
   
    srs_error_t err = srs_success;
    
    while (true) {
   
        if ((err = trd->pull()) != srs_success) {
   
            return srs_error_wrap(err, "tcp listener");
        }
        /*接受一个链接*/
        srs_netfd_t fd = srs_accept(lfd, NULL, NULL, SRS_UTIME_NO_TIMEOUT);
        if(fd == NULL){
   
            return srs_error_new(ERROR_SOCKET_ACCEPT, "accept at fd=%d", srs_netfd_fileno(lfd));
        }
        
        if ((err = srs_fd_closeexec(srs_netfd_fileno(fd))) != srs_success) {
   
            return srs_error_wrap(err, "set closeexec");
        }
        /*调用处理函数*/
        if ((err = handler->on_tcp_client(fd)) != srs_success) {
   
            return srs_error_wrap(err, "handle fd=%d", srs_netfd_fileno(fd));
        }
    }
    
    return err;
}

创建SrsRtmpConn

on_tcp_client最后调用会调用fd2con,将fd生成对应的SrsRtmpConn对像。

srs_error_t SrsServer::fd2conn(SrsListenerType type, srs_netfd_t stfd, SrsConnection** pconn)
{
   
    /*.....*/

    if (type == SrsListenerRtmpStream) {
   
        *pconn = new SrsRtmpConn(this, stfd, ip, port);
    } else if (type == SrsListenerHttpApi) {
   
        *pconn 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值