本文转自EasyDarwin开源团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52950948

EasyRTMP

前面介绍过EasyRTMP是高效的跨平台的RTMP推送库,内部rtmp协议部分使用了librtmp( RTMPDump Real-Time Messaging Protocol API)。

libEasyRTMP的基本操作

RTMP_Alloc() :用于创建一个RTMP会话的句柄。

RTMP_Init():初始化句柄。

RTMP_SetupURL():设置会话的参数。

RTMP_Connect():建立RTMP链接中的网络连接(NetConnection)。

RTMP_ConnectStream():建立RTMP链接中的网络流(NetStream)。

RTMP_Read():读取RTMP流的内容。

客户端可以在调用RTMP_Connect()之前调用RTMP_EnableWrite(),然后在会话开始之后调用 RTMP_Write()。

RTMP_Pause():流播放的时候可以用于暂停和继续

RTMP_Seek():改变流播放的位置

当RTMP_Read()返回0 字节的时候,代表流已经读取完毕,而后可以调用RTMP_Close()

RTMP_Free():用于清理会话。

所有的数据都使用 FLV 格式进行传输。一个基本的会话需要一个RTMP URL。RTMP URL 格式如下所示:

rtmp[t][e|s]://hostname[:port][/app[/playpath]]

支持普通的,隧道的,以及加密的会话。

其他附加的选项可以在URL的后面添加以空格为间隔符的“key=value”形式的字符串。

推送视频流是CPU较高

  • LibRTMP的结构体RTMP的成员是有m_outChunkSize,并且在RTMP_Init函数中被初始化了默认值128,然后整个LibRTMP代码没有改变m_outChunkSize的接口函数,内部也没有改变m_outChunkSize的实现逻辑,也没有发送改变块大小的消息给流媒体服务器的代码逻辑,关闭Nagle加如此小的块大小会导致很多小包,而以太网的MTU是1500,这样如果用在播放客户端由于主要是接收媒体流到也没有什么,但是如果用在发布媒体流的推流客户端网络效率就太低了,并且IP小包太多还会引起流媒体的服务器软中断升高,导致内核占用的CPU过高。

  • 调整输出块大小的函数

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);
}
  • 调用调整输出块大小的函数的时机
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

本文感谢:http://www.cnblogs.com/oldmanlv/p/5487146.html

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2016

最新文章

  1. WAP端 经验记录1
  2. C# .NET 动态调用webservice的三种方式
  3. dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算(终结版)
  4. css元素position定位和z-index
  5. javaweb学习总结一(eclipse常用快捷键、debug调试以及junit测试框架)
  6. vs工程链接出现error LNK2005...already defined
  7. C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
  8. 【Beta】 第五次Daily Scrum Meeting
  9. 迭代子模式(Iterator)
  10. 【原创】Linux服务器集群通过SSH无密码登录
  11. makefile(一)
  12. SQL Server 备份到网络盘网络映射盘
  13. Github版本管理以及git使用
  14. 修改MyEclipse取消默认工作空间
  15. C++原型模式和模板模式
  16. 14.7.1&14.7.2
  17. python第十八课——常用内置函数
  18. Vertical-Align你应该知道的一切
  19. 结合BeautifulSoup和hackhttp的爬虫实例
  20. ElasticSearch调优问题

热门文章

  1. POJ3625 Building Roads
  2. 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)
  3. transform与position:fixed的那些恩怨--摘抄
  4. delphi 四舍五入Round函数【百帖整理】
  5. delphiIDE 把 window 桌面改慢后的 还原方法
  6. java 正则表达式-忽略大小写与多行匹配
  7. Win10下安装Docker及tensorflow(cpu版)
  8. Netty学习_Netty框架入门教程:Netty入门之HelloWorld实现
  9. linux删除空行操作:awk、grep、tr、sed
  10. persits.jpeg 水印组件