日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EasyRTMP CPU占用问题调优(一)

發(fā)布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EasyRTMP CPU占用问题调优(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

EasyRTMP

前面介紹過EasyRTMP是高效的跨平臺的RTMP推送庫。

libEasyRTMP的基本操作

RTMP_Alloc() :用于創(chuàng)建一個RTMP會話的句柄。?
RTMP_Init():初始化句柄。?
RTMP_SetupURL():設(shè)置會話的參數(shù)。?
RTMP_Connect():建立RTMP鏈接中的網(wǎng)絡(luò)連接(NetConnection)。?
RTMP_ConnectStream():建立RTMP鏈接中的網(wǎng)絡(luò)流(NetStream)。?
RTMP_Read():讀取RTMP流的內(nèi)容。?
客戶端可以在調(diào)用RTMP_Connect()之前調(diào)用RTMP_EnableWrite(),然后在會話開始之后調(diào)用 RTMP_Write()。?
RTMP_Pause():流播放的時候可以用于暫停和繼續(xù)?
RTMP_Seek():改變流播放的位置?
當(dāng)RTMP_Read()返回0 字節(jié)的時候,代表流已經(jīng)讀取完畢,而后可以調(diào)用RTMP_Close()?
RTMP_Free():用于清理會話。?
所有的數(shù)據(jù)都使用 FLV 格式進行傳輸。一個基本的會話需要一個RTMP URL。RTMP URL 格式如下所示:?
rtmp[t][e|s]://hostname[:port][/app[/playpath]]?
支持普通的,隧道的,以及加密的會話。?
其他附加的選項可以在URL的后面添加以空格為間隔符的“key=value”形式的字符串。

推送視頻流是CPU較高

  • LibRTMP的結(jié)構(gòu)體RTMP的成員是有m_outChunkSize,并且在RTMP_Init函數(shù)中被初始化了默認(rèn)值128,然后整個LibRTMP代碼沒有改變m_outChunkSize的接口函數(shù),內(nèi)部也沒有改變m_outChunkSize的實現(xiàn)邏輯,也沒有發(fā)送改變塊大小的消息給流媒體服務(wù)器的代碼邏輯,關(guān)閉Nagle加如此小的塊大小會導(dǎo)致很多小包,而以太網(wǎng)的MTU是1500,這樣如果用在播放客戶端由于主要是接收媒體流到也沒有什么,但是如果用在發(fā)布媒體流的推流客戶端網(wǎng)絡(luò)效率就太低了,并且IP小包太多還會引起流媒體的服務(wù)器軟中斷升高,導(dǎo)致內(nèi)核占用的CPU過高。

  • 調(diào)整輸出塊大小的函數(shù)

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 調(diào)用調(diào)整輸出塊大小的函數(shù)的時機
if (r->Link.protocol & RTMP_FEATURE_WRITE) { ChangeChunkSize(r, 1360);//若不改拉流時的輸出塊大小在這里調(diào)用ChangeChunkSize SendReleaseStream(r); SendFCPublish(r); } else { RTMP_SendServerBW(r); RTMP_SendCtrl(r, 3, 0, 300); }//ChangeChunkSize(r,1360);//若推、拉流時的輸出塊大小都改變在這里調(diào)用ChangeChunkSize
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

獲取更多信息

郵件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright ? EasyDarwin.org 2012-2016

總結(jié)

以上是生活随笔為你收集整理的EasyRTMP CPU占用问题调优(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。