基於live555實現的RTSPServer對底層進行效能優化的方法
阿新 • • 發佈:2019-01-27
在部落格《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