EasyRTMP直播推送效率優化之開源librtmp CPU占用高效率優化


本文轉自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

EasyDarwin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM