使用librtmp发布直播流,RTMP_SendPacket()阻塞怎么解决

Yondu202 2015-04-24 02:20:38
获取屏幕图像,编码264并用librtmp发布成直播流,调用RTMP_SendPacket经常会出现阻塞现象,通常为几秒甚至10几秒,这导致直播流卡顿以及延时。
我在librtmp内部RTMP_Connect0中加入了send超时设置,

{

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
网络:局域网无线
...全文
8852 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
aggresss 2017-08-09
  • 打赏
  • 举报
回复
5楼正解, librtmp重连接前最好 重新调用RTMP_Init
EasonTG 2017-06-23
  • 打赏
  • 举报
回复
解决了吗?我也遇到和6楼同样的问题求解决办法
小羽1 2017-01-16
  • 打赏
  • 举报
回复
楼主,您好,我想问一下怎么把这个h264的码流发出去,而不是单纯的发送文件
来瓶红牛 2017-01-10
  • 打赏
  • 举报
回复
楼上你好,在使用librtmp的时候,遇到网络阻塞的时候,按照你那样修改,RTMP_SendPacket的RTMPSockBuf_Send可以超时返回,接着调用RTMP_Close,但调用RTMP_Close的时候又调用了SendFCUnpublish,而SendFCUnpublish又调用了RTMP_SendPacket,如此死循环,没法退出了。请问有什么解决方面呢?谢谢!
细细斌to细斌 2016-09-06
  • 打赏
  • 举报
回复
我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。 上面的解决方法在最近的实验中发现,并不能真正发现预防网络掉线后及时发现并做相应的处理。以下的解决方法才是从根本原因解决了阻塞的问题。 在librtmp的RTMP_Connect0( )中加入了send超时设置,如下添加蓝色部分代码,并重新编译librtmp库:
/* 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);
    }
}
细细斌to细斌 2016-08-15
  • 打赏
  • 举报
回复
最近项目中也遇到使用librtmp发布264直播流,用的是公司的无线网络,推流时经常出现阻塞现象。 排查了一个星期,发现由于在推流时,无线网络不稳定,路由器出现掉网,rtmp流继续保持连接状态,并不知道网络已经断开,继续往服务器上推,结果导致服务器buffer塞满,出现阻塞,等待网络恢复后,服务器一点点慢慢把buffer里面的数据送出去,时间有点长,大概需要30-40分钟左右才恢复正常。(阻塞现象的根本原因是路由器网络不稳定导致的) 我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。
Putin_yhc 2015-05-24
  • 打赏
  • 举报
回复
很可能是无线导致的,你换有线试试
Yondu202 2015-05-07
  • 打赏
  • 举报
回复
木有解决啊, 网络明明是好的,但是总是断线
bytedance-踏锋 2015-05-03
  • 打赏
  • 举报
回复
楼上怎么解决的???

2,275

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计/Flash/Silverlight 开发 Flash流媒体开发
社区管理员
  • Flash流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧