14 海思Hi3518E用RTSP傳輸實時視訊

QQ2651401966發表於2019-03-25

有兩種實現方式

第一種:直接傳送

RtspServer_init
	RtspServerListen
		RtspClientMsg  //執行緒1 : 不斷監控是否又客服端來連線自己,並且建立雙方的連線
			if(strstr(cmdName, "OPTIONS"))  OptionAnswer;
			if(strstr(cmdName, "DESCRIBE")) DescribeAnswer;
			if(strstr(cmdName, "SETUP"))    SetupAnswer;
			if(strstr(cmdName, "PLAY"))     PlayAnswer;
			if(strstr(cmdName, "PAUSE"))    PauseAnswer;
			if(strstr(cmdName, "TEARDOWN")) TeardownAnswer;

SAMPLE_VENC_720P_CLASSIC
	SAMPLE_COMM_VENC_StartGetStream
		SAMPLE_COMM_VENC_GetVencStreamProc  //執行緒2 : 不斷從海思的解碼器中獲取H.264碼流
		   save_stream_rtsp
		     VENC_Sent  //正真的傳送資料
		       sendto(udpfd, sendbuf, bytes, 0, (struct sockaddr *)&server,sizeof(server));
                                        //向UDP中傳送資料

第二種:利用buffer和執行緒環回傳送

RtspServer_init
	RtspServerListen
		RtspClientMsg  //執行緒1 : 不斷監控是否又客服端來連線自己,並且建立雙方的連線
			if(strstr(cmdName, "OPTIONS"))  OptionAnswer;
			if(strstr(cmdName, "DESCRIBE")) DescribeAnswer;
			if(strstr(cmdName, "SETUP"))    SetupAnswer;
			if(strstr(cmdName, "PLAY"))     PlayAnswer;
			if(strstr(cmdName, "PAUSE"))    PauseAnswer;
			if(strstr(cmdName, "TEARDOWN")) TeardownAnswer;
		vdRTPSendThread  //執行緒2 : 不斷監控全域性變數的RTP_BUF是否為空,不為空就傳送資料
			VENC_Sent  //正真的傳送資料
			  sendto(udpfd, sendbuf, bytes, 0, (struct sockaddr *)&server,sizeof(server));
                                        //向UDP中傳送資料

SAMPLE_VENC_720P_CLASSIC
	SAMPLE_COMM_VENC_StartGetStream
		SAMPLE_COMM_VENC_GetVencStreamProc  //執行緒3 : 不斷從海思的解碼器中獲取H.264碼流
			saveStream
				list_add_tail(&(p->list),&RTP_BUF);//新增資料

第一種:這種方式是,獲取到一幀h.264碼流,就馬上通過rtsp傳送。

優點:編寫程式碼簡單。

缺點:不能應對真實網路,有時候網路會阻塞,這樣會導致上一幀還沒有傳送結束,下一幀就來了,這樣會讓視訊的失真率變高。

第二種:這種利用全域性變數buffer,把從海思中傳來的視訊流,先儲存到buffer中,而單開的執行緒,只管傳送資料,有就發,沒有就等待。

優點:適合網路傳輸的需求。

缺點:編寫程式碼複雜。

 

真正的傳送函式:

HI_S32 VENC_Sent(char *buffer,int buflen);

這個函式包含了所有視訊要傳送的所操作,包括封包,拆包。

對於每一個NALU,根據其包含的資料量的不同,其大小也有差異。在IP網路中,當要傳輸的IP 報文大小超過最大傳輸單元MTU(Maximum Transmission Unit )時就會產生IP分片情況。在乙太網環境中可傳輸的最大 IP 報文(MTU)的大小為 1500 位元組。如果傳送的IP資料包大於MTU,資料包就會被拆開來傳送,這樣就會產生很多資料包碎片,增加丟包率,降低網路速度。對於視訊傳輸而言,若RTP 包大於MTU 而由底層協議任意拆包,可能會導致接收端播放器的延時播放甚至無法正常播放。因此對於大於MTU 的NALU 單元,必須進行拆包處理。
 

參考:

使用RTP傳輸H.264格式視訊

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章