2014-11-21 233 views
0

我使用Live555實現IP攝像頭的C++ RTPS客戶端。 我正在使用大部分testRTSPClient代碼。Live555客戶端流媒體內存泄漏

我也使用了Poco庫和Poco :: Thread類。

換句話說,每個攝像頭的任何客戶端都運行在一個單獨的線程中,擁有其Live555對象實例(如live555-devel所示,任何線程都在UsageEnvironment和TaskScheduler中使用實例)。這是爲了避免共享變量和同步的東西。它似乎運作良好和快速。

我可運行(繼波蘇庫需求)對象IPCamera的具有run方法簡單:

void IPCamera::run() 
{ 
    openURL(_myEnv, "", _myRtspCommand.c_str(), *this); //taken from the testRTSPClient example 

    _myEnv->TaskScheduler().doEventLoop(&_watchEventLoopVariable); 
    //it runs until _watchEventLoopVariable change to a value != 0 

    //exit from the run; 
} 

當運行完成後我打電話join()方法來關閉線程(由我想通的方式如果我不調用myThread-> join(),內存不會完全釋放)。

在關機時,按照LIVE555-devel的,我把我的代碼的要求:

void IPCamera::shutdown() 
{ 
    ... 
    _myEnv->reclaim(); 
    delete _myScheduler; 
} 

使用Valgrind的檢測內存泄漏我看到一個奇怪的現象:

1)情況:運行程序 - 用適當方式運行的所有IPCameras關閉程序。

a)程序結束時調用所有的析構函數。

b)從doEventLoop()退出。

c)中加入的螺紋(實際上被終止,因爲它從運行方法退出。

d)破壞_myEnv和_myScheduler作爲顯示。 e)銷燬其他所有對象,包括IPCamera和Thread關聯。

- > Valgrind沒有發現內存泄漏。好吧

現在出現這個問題。

2)案例:我正在實現一個用例,其中Poco :: Timer每隔X秒檢查一次,如果相機使用ICMP ping工作。這引發一個事件(使用波科事件)的情況下,它不會回答,因爲在網絡出現故障,我做了如下:

IPCamera的下降:

一)把_watchEventLoopVariable = 1到退出運行方法;

B)關機)關聯到IPCamera的作爲顯示

c中的客戶端連接線程

我不破壞線程,因爲我想再次重用它當網絡並在攝像頭能again.And在這種情況下: 一)我設置_eventWatchVariable = 0 b)與我們再次啓動線程:myThread-> run()的

Valgrind的告訴我,內存泄漏被發現:60個字節直接,20。000個間接字節在線程中丟失,在H264BufferdPackedFactory :: createNewPacket(...)中,這是Live555的一個類。

回答

2

求助 我發現問題是通過TCP隧道。在LIVE55中,您可以選擇協議類型。 如果我選擇:

#define REQUEST_STREAMING_OVER_TCP false 

我沒有任何泄漏。我多次使用Valgrind來確定(它發現了這個問題)。

如果我使用TCP,那麼上述問題就會顯現出來。