LibRTMP优化之调整输出块大小

1. 为什么要调整输出块大小

首先在RTMP_Connect0函数中LibRTMP是关闭了Nagle算法这个TCP选项的,为了实时性这样做是好的,但是要注意到LibRTMP的结构体RTMP的成员是有m_outChunkSize,并且在RTMP_Init函数中被初始化了默认值128,然后整个LibRTMP代码没有改变m_outChunkSize的接口函数,内部也没有改变m_outChunkSize的实现逻辑,也没有发送改变块大小的消息给流媒体服务器的代码逻辑,关闭Nagle加如此小的块大小会导致很多小包,而以太网的MTU是1500,这样如果用在播放客户端由于主要是接收媒体流到也没有什么,但是如果用在发布媒体流的推流客户端网络效率就太低了,并且IP小包太多还会引起流媒体的服务器软中断升高,导致内核占用的CPU过高。m_outChunkSize在发送给流媒体服务器消息会用于分块,所以从这个方面来说LibRTMP还是部分支持改变块大小的,这部分逻辑实现不需要任何改变。

2. 调整输出块大小的函数

static int
ChangeChunkSize(RTMP *r,int outChunkSize)
{
RTMPPacket packet;
char pbuf[RTMP_MAX_HEADER_SIZE + 4];

packet.m_nBytesRead = 0;
packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;

packet.m_packetType = RTMP_PACKET_TYPE_CHUNK_SIZE;
packet.m_nChannel = 0x04; 
packet.m_headerType = RTMP_PACKET_SIZE_LARGE;
packet.m_nTimeStamp = 0;
packet.m_nInfoField2 = 0;
packet.m_hasAbsTimestamp = 0;
packet.m_nBodySize = 4;
r->m_outChunkSize = outChunkSize;

r->m_outChunkSize = htonl(r->m_outChunkSize);

memcpy(packet.m_body, &r->m_outChunkSize, 4);

r->m_outChunkSize = ntohl(r->m_outChunkSize);

return RTMP_SendPacket(r, &packet, TRUE);
}

注1:RTMP协议的消息类型01(RTMP_PACKET_TYPE_CHUNK_SIZE宏的值)就是用于改变输出块大小的消息类型,结合MTU

注2:outChunkSize大小可以选择1500-20(IP头)-20(TCP头)=1460,考虑到IP头、TCP头有扩展选项,加之PPPoE,为保证起见可选为1360,也可以设为大于MTU的其它值,不过这样的话就会出现IP分片了,也不是好习惯。

注3:每当调用本函数后就顺便修改了RTMP的成员变量m_outChunkSize,以保持与服务器收到的一致。

3. 调用调整输出块大小的函数的时机

随时可以调整,只不过在调用ChangeChunkSize函数后,要注意到这个函数内部已经改变了RTMP的成员变量m_outChunkSize,这样在调用这个函数之后的所有发给流媒体服务器的消息要以这个块大小来分块,由于TCP的有序性,服务器在收到该改变块大小的消息后也会以此块大小来解析后序的所有消息,由于播放客户端主要是拉流,播放端需要传给服务器的数据不多,可以不修改,基于此可以在收到connect的响应后的处理逻辑中调用ChangeChunkSize函数,具体如下(HandleInvoke函数中部分代码):

if (r->Link.protocol & RTMP_FEATURE_WRITE)
{
ChangeChunkSize(r, 1360);//若不改拉流时的输出块大小在这里调用ChangeChunkSize
SendReleaseStream(r);
SendFCPublish(r);
}
else
{
RTMP_SendServerBW(r);
RTMP_SendCtrl(r, 3, 0, 300);
}

//ChangeChunkSize(r,1360);//若推、拉流时的输出块大小都改变在这里调用ChangeChunkSize

4. 调整输出块大小带来的变化

  1. 主要用于发布媒体的源流媒体服务器CPU下降10%
  2. 通过调整流媒体服务器的输出块大小与媒体流发布客户端一致,流媒体不再需要分块了,而是可以直接转发,这样也会节省一定CPU
  3. 每一路媒体流流量下降15%

5 音频小包如何处理

对于44.1KHZ双声音,对于采集周期为2048个样本的音频数据通过AAC+SBR音频编码后大小在100到300字节之间结合实时性,有两个处理策略,1 小包就小了,为了实时也就这样了,必竟音频数据量不大 2 RTMP本身是基于RTMP块流协议的,可以在应用层将音频块与视频块合包,当接近MTU时才通过socket 发送给流媒体服务器。

时间: 2024-10-14 03:53:46

LibRTMP优化之调整输出块大小的相关文章

HDFS概述(1)————Block块大小设置

以下内容转自:http://blog.csdn.net/samhacker/article/details/23089157?utm_source=tuicool&utm_medium=referral http://snglw.blog.51cto.com/5832405/1643587 小文件BLOCK占用 [小于块大小的小文件不会占用整个HDFS块空间.也就是说,较多的小文件会占用更多的NAMENODE的内存(记录了文件的位置等信息):再者,在文件处理时,可能会有较大的网络开销.] 一个常

洛谷P1141 //bfs求无向图的子连通块大小(多次询问)

http://www.luogu.org/problem/show?pid=1141 多询问题,求无向图的子连通块大小. 直接bfs,读一个搜一个,过60: 100%的点1,000,000个点,100,000次询问,显然是记忆化. 我很弱,最开始开了个数组记录每个点属于的连通块的第一个点的坐标,然后写了一堆,自己都烦. 后来问某大神,似拨开云雾见到了青天.用cnt记录连通块的" 名字 ". 学会了这一招,不代表过了. 我还是读一个点,如果访问过就输出,没访问就dfs,然后每dfs就循环

调整swap分区大小-Linux下安装Oracle时报swap不够解决方法

调整swap分区大小 方法一:如果磁盘有剩余的空间,用分区工具新建一个swap分区.并写到/etc/fstab里面.再 #swapon -a方法二:可以用一个文件做交换分区. su root cd / mkdir /swap 1.建立swap文件,比如在/tmp下建立swapfree作为交换文件.建立#dd if=/dev/zero f=swapfree bs=32k count=8192(bs=32k指定每个扇区占用32kb,读入了8192+0个区段,输出了8192+0个区段) 注意:bs参数

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

Linux系统之更改默认块大小

查看操作系统块大小:#tune2fs  -l /dev/sda1 |grep 'block size'               ( tune2fs  -l  /dev/sda1可以查看更多相关文件系统的详细信息 ) 查看os系统页的大小: #getconf PAGESIZE 创建文件系统时,可以指定块的大小.如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能.将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fs

(3) 在线调整ceph rbd 大小

############在线调整ceph RBD 大小##########Ceph 支持自动精简配置的块设备,也就是说 只有当把数据存储到这个块设备时,才会真正地使用物理存储空间,ceph RADOS 设备非常灵活,你可以自由地增加或者减少RBD的容量 当然,这需要底层的文件系统也支持调整容量.高级文件系统(例如 XFS ,Btrfs,EX ZFS)都支持在指定条件下调整文件系统容量. #(1)客户端中查看remote_rbd71容量[[email protected] /]# rbd --im

画图软件中调整图像的大小

在打开Windows附件的画图软件时,有时候截屏.或者其它图形粘贴的大小不合式.需要调整图像的大小. 画图软件有两个界面可调整:内界面是蓝色背景中的白色矩形,外界面是画图软件的边框.内界面固定在边框内,但是长.宽可以通过鼠标拉伸. 拉伸时,鼠标为从右下至左上的斜线型.调整内界面才能调整图像的大小. 如果内界面和外界面边界基本重合,则需要将进度条向右下角汇聚,直至出现内边界的右下"角".从这个角出发,将内边界从下往上.从右往左 拉动,可以发现内边界能移动.通常,在内边界和外边界之间都保存

修改HDFS块大小

环境:OS:Centos 6.5 x64 & Soft:Hadoop 1.2.1 1.查看当前块大小,默认64M. [[email protected] hadoop-1.2.1]$ bin/hadoop fs -stat "%o" ./in/test1.txt67108864 2.修改hdfs-site.conf配置文件,增加全局参数dfs.block.size. [[email protected] hadoop-1.2.1]$ cat conf/hdfs-site.xml

HDFS概述(2)————Block块大小设置

参考: HDFS概述(4)----HDFS权限 HDFS概述(3)----HDFS Federation HDFS概述(1)----HDFS架构 问题 Q: 一个常被问到的一个问题是: 如果一个HDFS上的文件大小(file size) 小于块大小(block size) ,那么HDFS会实际占用Linux file system的多大空间? A: 答案是实际的文件大小,而非一个块的大小. 以下内容转自: http://blog.csdn.net/samhacker/article/detail