1. 程式人生 > 實用技巧 >TSINGSEE青犀視訊編譯WebRTC使用VideoTrackInterface類析構崩潰報“引發了異常:讀取訪問許可權衝突”問題

TSINGSEE青犀視訊編譯WebRTC使用VideoTrackInterface類析構崩潰報“引發了異常:讀取訪問許可權衝突”問題

在TSINGSEE青犀視訊開發WebRTC時,使用了VideoTrackInterface類,WebRTC建立了一個VideoTrack實現VideoTrackInterface介面,VideoTrack新建了一個VideoTrackRenderers物件來完成VideoRendererInterface介面到VideoRenderer介面的適配工作。VideoTrackRenderers一方面從VideoRenderer介面派生,這樣就可以將自己通過VideoSourceInterface的AddSink方法掛接進去來接收視訊幀資料,另一方面將接收到的視訊幀資料分發給外部掛接給VideoTrackInterface的VideoRendererInterface介面。

我們例項化一個VideoTrackInterface類物件;進行析構時,觸發一個端點崩潰;出現“引發了異常:讀取訪問許可權衝突,this->ptr_->是0xDDDDDDDD”原因。

這類問題好多都是指標的初始化所造成的,所以當報這個錯誤的時候,先檢查一下自己的指標是否初始化。

記憶體衝突問題經常發生在malloc和new xxx[xxxx]等進行分配後指標的使用上。C和C++中的指標其優勢很明顯,靈活和方便,這樣使用起來簡單;但是劣勢當然也很明顯,就是容易導致系統崩潰。指標操作不當、來不及釋放、沒有判斷指標是否越界和沒有及時置空,都會導致系統崩潰。

我們在使用VideoTrackInterface類中,使用的是WebRTC中計數函式來例項化的,如下圖:

所以釋放資源使用videoTrack=nullptr能更好釋放資源;並且建立的音視訊工廠也要隨著釋放資源,否則也會導致訪問衝突。

音視訊工廠建立如下:

Factory = webrtc::CreatePeerConnectionFactory(
		nullptr, nullptr, SignalingThread, nullptr,
		webrtc::CreateBuiltinAudioEncoderFactory(),       
	  webrtc::CreateBuiltinAudioDecoderFactory(),
	  webrtc::CreateBuiltinVideoEncoderFactory(),
	  webrtc::CreateBuiltinVideoDecoderFactory(),
	  nullptr /*audio_mixer*/,
	  nullptr /*audio_processing*/);

釋放音視訊工廠如下:

Factory.release();