调用RTMP_SendPacket经常会出现阻塞现象

来源:互联网 发布:知识产权投诉淘宝处罚 编辑:程序博客网 时间:2024/04/28 10:58

http://bbs.csdn.net/topics/391023560


获取屏幕图像,编码264并用librtmp发布成直播流,调用RTMP_SendPacket经常会出现阻塞现象,通常为几秒甚至10几秒,这导致直播流卡顿以及延时。
我在librtmp内部RTMP_Connect0中加入了send超时设置,
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
{
  
    SET_RCVTIMEO(tv, r->Link.timeout);
    if (setsockopt
        (r->m_sb.sb_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)))
      {
        RTMP_Log(RTMP_LOGERROR, "%s, Setting socket timeout to %ds failed!",
        __FUNCTION__, r->Link.timeout);
      }
  }


看了RTMP_SendPacket的源码,最后确定是RTMPSockBuf_Send中send(sb->sb_socket, buf, len, 0);这里,tcp send阻塞住了。

但是找不到原因,请问有谁有过类似经验的吗?

我在同样的网络下,发送一个flv文件就不会出现这种现象。

rtmp服务器:fms3.5
网络:局域网无线
  •  
  •  
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:7
#1 得分:0回复于: 2015-05-03 19:19:36
楼上怎么解决的???
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#2 得分:0回复于: 2015-05-07 15:17:52
木有解决啊, 网络明明是好的,但是总是断线
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#3 得分:0回复于: 2015-05-24 22:50:54
很可能是无线导致的,你换有线试试
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#4 得分:40回复于: 2016-08-15 16:40:29
最近项目中也遇到使用librtmp发布264直播流,用的是公司的无线网络,推流时经常出现阻塞现象。

排查了一个星期,发现由于在推流时,无线网络不稳定,路由器出现掉网,rtmp流继续保持连接状态,并不知道网络已经断开,继续往服务器上推,结果导致服务器buffer塞满,出现阻塞,等待网络恢复后,服务器一点点慢慢把buffer里面的数据送出去,时间有点长,大概需要30-40分钟左右才恢复正常。(阻塞现象的根本原因是路由器网络不稳定导致的)

我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#5 得分:0回复于: 2016-09-06 14:56:18
我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。

上面的解决方法在最近的实验中发现,并不能真正发现预防网络掉线后及时发现并做相应的处理。以下的解决方法才是从根本原因解决了阻塞的问题。

在librtmp的RTMP_Connect0( )中加入了send超时设置,如下添加蓝色部分代码,并重新编译librtmp库:
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* set timeout */
{
    struct timeval timeout;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;
       
    SET_RCVTIMEO(tv, r->Link.timeout);
    if (setsockopt
        (r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)))
      {
        RTMP_Log(RTMP_LOGERROR, "%s, Setting socket timeout to %ds failed!", __FUNCTION__, r->Link.timeout);
      }
       
if(setsockopt
        (r->m_sb.sb_socket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == -1)
    {
        RTMP_Log(RTMP_LOGERROR, "%s, Setting socket timeout to %ds failed!", __FUNCTION__, timeout.tv_sec);
    }
    else
    {
        RTMP_Log(RTMP_LOGDEBUG, "%s, Setting socket timeout to %ds success!", __FUNCTION__, timeout.tv_sec);
    }
}
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
#6 得分:0回复于: 2017-01-10 17:53:31
楼上你好,在使用librtmp的时候,遇到网络阻塞的时候,按照你那样修改,RTMP_SendPacket的RTMPSockBuf_Send可以超时返回,接着调用RTMP_Close,但调用RTMP_Close的时候又调用了SendFCUnpublish,而SendFCUnpublish又调用了RTMP_SendPacket,如此死循环,没法退出了。请问有什么解决方面呢?谢谢!
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#7 得分:0回复于: 2017-01-16 22:38:28
楼主,您好,我想问一下怎么把这个h264的码流发出去,而不是单纯的发送文件




0 0
原创粉丝点击