1. 程式人生 > >基於live555實現的RTSPServer對底層進行效能優化的方法

基於live555實現的RTSPServer對底層進行效能優化的方法

在部落格《EasyIPCamera高效能攝像機RTSP伺服器RTSPServer解決方案》我介紹了基於live555實現的一套RTSPServer功能元件,當時開發者經過幾個月的除錯,已經將底層的效能除錯到了一個業界非常優秀的程度,主要優化的幾點:

  • 傳送優化
  • 排程優化

傳送優化方面,主要就是調整live555的緩衝區大小和每次傳送的資料大小,眾所周知,流媒體傳送的是各種大小的音視訊資料,而這些資料大的幾百k,小的就幾個位元組,如果每一個零散的資料都要走一遍傳送迴圈,對於live555這種單執行緒的架構來說,效能吃緊,所以,我們做了幾點調整:


RTPInterface.cpp

129
行: increaseSendBufferTo(envir(), fGS->socketNum(), 512*1024); //資料累積傳送,不再單獨傳送 //註釋掉332行,修改為以下: //if (!sendDataOverTCP(socketNum, framingHeader, 4, False)) break; //if (!sendDataOverTCP(socketNum, packet, packetSize, True)) break; struct iovec iov[2]; iov[0].iov_base = framingHeader; iov[0].iov
_len = 4; iov[1].iov_base = packet; iov[1].iov_len = packetSize; writev(socketNum, iov, 2);

在排程方面的優化


402//當前的資料緩衝區如果沒有傳送完成,就繼續傳送,不再走一遍live555的eventloop流程,提高效率!

#if 0
    // We have more frames left to send.  Figure out when the next frame
    // is due to start playing, then make sure that we wait this long before
// sending the next packet. struct timeval timeNow; gettimeofday(&timeNow, NULL); int secsDiff = fNextSendTime.tv_sec - timeNow.tv_sec; int64_t uSecondsToGo = secsDiff*1000000 + (fNextSendTime.tv_usec - timeNow.tv_usec); if (uSecondsToGo < 0 || secsDiff < 0) { // sanity check: Make sure that the time-to-delay is non-negative: uSecondsToGo = 0; } if (uSecondsToGo > 0) printf("uSecondsToGo: %d\n", uSecondsToGo); // Delay this amount of time: nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo, (TaskFunc*)sendNext, this); #else sendNext(this); #endif

這樣幾點修改,大大提升了live555在網路資料傳送方面的效能,使得在海思3516A這樣的板子上,高清視訊能提升到4路4M高清視訊的傳送,且很穩定(當然,網路一定要保證,大部分走wifi的測試都到不了這個效果)!

關於EasyIPCamera

EasyIPCamera是一套非常穩定、易用、支援多種平臺(包括Windows/Linux 32&64,Android,ARM hisiv100/hisiv200/hisiv400等平臺)的RTSP Server元件,適用於IPCamera、內網RTSP服務等小型RTSP流媒體伺服器,介面呼叫非常簡單成熟,無需關注RTSPServer中關於客戶端監聽接入、音視訊多路複用、RTSP具體流程、RTP打包與傳送等相關問題,支援多種音視訊格式,再也不用像呼叫live555 RTSPServer那樣處理整個RTSP OPTIONS/DESCRIBE/SETUP/PLAY/RTP/RTCP的複雜流程和擔心記憶體釋放的問題了!

獲取更多資訊

Copyright © EasyDarwin.org 2012-2017

EasyDarwin