問題描述:ffplay播放rtsp視頻流時,播放過程當中隨機出現花屏現象。函數
基本流程學習:閱讀ffplay源碼,熟悉其播放rtsp視頻流的基本流程。學習
在ffplay源碼閱讀和分析的基礎上,畫出了其播放rtsp的函數調用關係,以下圖所示:測試
avformat_open_input函數根據輸入的文件名,與rtsp_read_packet關聯。spa
rtsp_read_packet完成每一個rtp包的讀取和解析,讀取主要是利用rtp_read從緩衝區獲取數據,解析主要是根據rtp協議,解析rtp包,獲得h264碼流數據,由rtp_parse_packet完成。orm
av_read_frame讀取一幀數據的avpacket包,主要是調用rtsp_read_packet讀取h264碼流數據包,而後由av_parser_parse2組成h264 碼流包,最終組成一幀數據的avpacket。視頻
錯誤測試:發佈不一樣分辨率的rtsp視頻流,測試錯誤產生的緣由。input
利用VLC發佈視頻的rtsp服務,經測試,同一種視頻封裝格式,分辨率越小,花屏現象越少。源碼
分辨率越小,服務端發送給客戶端的數據越小,其花屏現象越少,說明花屏現象與服務端發送的數據量有關。form
可能的緣由是服務端發送的數據量較大時,客戶端緩衝區不足,致使數據丟失的問題,從而引發花屏現象。class
錯誤驗證:修改ffmpeg源碼,輸出客戶端接收的數據包信息,驗證是否存在數據丟失的問題。
源碼修改以下圖所示,主要是輸出RTP包的序號,根據序號判斷是否存在丟包問題。
信息輸出結果以下圖所示,正常狀況下,RTP的序號是連續的,而由輸出信息可知RTP序號不連續,於是存在丟包的問題。
解決方法:增長客戶端接收數據的緩衝區,避免丟包現象的產生。
源碼修改以下圖所示,主要是將UDP_MAX_PKT_SIZE增大了10倍。