http://bbs.csdn.net/topics/391023560
获取屏幕图像,编码264并用librtmp发布成直播流,调用RTMP_SendPacket经常会出现阻塞现象,通常为几秒甚至10几秒,这导致直播流卡顿以及延时。
我在librtmp内部RTMP_Connect0中加入了send超时设置,
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
网络:局域网无线
|
|
-
关注
-
liwf616
-
lo踏ve
-
本版等级:
-
|
#1 得分:0
回复于: 2015-05-03 19:19:36
楼上怎么解决的???
|
|
-
关注
-
fatiao101
-
发条101
-
本版等级:
-
|
#2 得分:0
回复于: 2015-05-07 15:17:52
木有解决啊, 网络明明是好的,但是总是断线
|
|
-
关注
-
yhc223
-
Putin_yhc
-
本版等级:
-
|
#3 得分:0
回复于: 2015-05-24 22:50:54
很可能是无线导致的,你换有线试试
|
|
-
关注
-
shuang9207
-
细细斌to细斌
-
本版等级:
-
|
#4 得分:40
回复于: 2016-08-15 16:40:29
最近项目中也遇到使用librtmp发布264直播流,用的是公司的无线网络,推流时经常出现阻塞现象。
排查了一个星期,发现由于在推流时,无线网络不稳定,路由器出现掉网,rtmp流继续保持连接状态,并不知道网络已经断开,继续往服务器上推,结果导致服务器buffer塞满,出现阻塞,等待网络恢复后,服务器一点点慢慢把buffer里面的数据送出去,时间有点长,大概需要30-40分钟左右才恢复正常。(阻塞现象的根本原因是路由器网络不稳定导致的)
我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。
|
|
-
关注
-
shuang9207
-
细细斌to细斌
-
本版等级:
-
|
#5 得分:0
回复于: 2016-09-06 14:56:18
我的解决方法是:直接用RTMP_IsConnected()在推流之前检测网络是否断开,流是否断开,如果发现断开,马上启动重连RTMP。这样可以避免在路由器不稳定的情况下,出现阻塞现象。
上面的解决方法在最近的实验中发现,并不能真正发现预防网络掉线后及时发现并做相应的处理。以下的解决方法才是从根本原因解决了阻塞的问题。
在librtmp的RTMP_Connect0( )中加入了send超时设置,如下添加蓝色部分代码,并重新编译librtmp库:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
{
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);
}
}
|
|
|
-
关注
-
rong_baisheng
-
来瓶红牛
-
本版等级:
-
|
#6 得分:0
回复于: 2017-01-10 17:53:31
楼上你好,在使用librtmp的时候,遇到网络阻塞的时候,按照你那样修改,RTMP_SendPacket的RTMPSockBuf_Send可以超时返回,接着调用RTMP_Close,但调用RTMP_Close的时候又调用了SendFCUnpublish,而SendFCUnpublish又调用了RTMP_SendPacket,如此死循环,没法退出了。请问有什么解决方面呢?谢谢!
|
|
-
关注
-
u012417758
-
小羽1
-
本版等级:
-
|
#7 得分:0
回复于: 2017-01-16 22:38:28
楼主,您好,我想问一下怎么把这个h264的码流发出去,而不是单纯的发送文件
|