1. 程式人生 > >RTSP客戶端接收H264的RTP包並解析遇到的問題

RTSP客戶端接收H264的RTP包並解析遇到的問題

關於RTSP怎麼握手,RTP包和H264的格式網上已經很多了,我就不贅述了。只說一下在做這個客戶端的時候遇到的問題。說明下,我的客戶端程式碼是從ffmpeg裡面提取出來的。

1、傳送PLAY命令後,服務端抓包顯示已經在發資料了,但是客戶端似乎沒收到資料。 

經過仔細檢查後發現,ffmpeg的rtp.h裡面有個巨集限制了接收到rtp包的大小為1500位元組,但是抓包發現客戶端傳送的最小包是8000+位元組。對於這種情況,ffmpeg的做法是丟掉超過限制大小的包,這樣就造成了服務端一直在發資料,而客戶端就是沒資料的情況。這樣也看出服務端是非常規的。把1500改成大於服務端最大資料包的大小即可。

2、傳送TEARDOWN命令後,服務端還在發音頻資料,視訊資料已經停止傳送了。

不知道服務端是什麼情況,收到此請求只關閉了視訊傳送執行緒。我的解決辦法是傳送TEARDOWN後客戶端就直接關閉socket,而不去等待是否返回200 OK。

3、解析出payload以後直接寫成H264不可以播放或者播放花屏。

服務端在傳送H264的時候去掉了開始碼0x00 0x00 0x00 0x01,所以解析出payload後要在每個完整幀前加上此開始碼。當然,這還是不夠的,還要解析出sps和pps資訊,加到關鍵幀的前面,sps和pps前面都要加上開始碼,pps後面接關鍵幀,關鍵幀前面也要有開始碼。最重要的是,要把關鍵幀的payload的第一個位元組的高3位和第二個位元組的低5位組合成一個位元組,這個位元組就是nal型別。如果不這樣做,播放的影象就是綠屏的。

4、非常規伺服器引發的問題。

1>sdp資訊中a='control:xxxxx'這個描述資訊,有些伺服器會在裡面帶上rtsp地址,所以客戶端在SETUP的時候一定要判斷一下trackID前面是否有rtsp://這樣的字元,不然SETUP請求會出錯或者PLAY請求後服務端不傳送資料。

2>有些服務端只在sdp資訊中返回sps和pps資訊,有些會在每幀關鍵幀前面發一次sps和pps資訊。對於前者要把a='fmtp:96 packetization-mode=1;profile-level-id=xxxxxx;sprop-parameter-sets=xxxxxxxxx'中的profile-level-id=xxxxxx;sprop-parameter-sets=xxxxxxxxx等號後面的資料進行BASE64解碼,得到的就是sps和pps。對於後者就是payload。