【FFmpeg】ffplay播放rtsp視頻流花屏問題


問題描述:ffplay播放rtsp視頻流時,播放過程中隨機出現花屏現象。

基本流程學習:閱讀ffplay源碼,熟悉其播放rtsp視頻流的基本流程。

在ffplay源碼閱讀和分析的基礎上,畫出了其播放rtsp的函數調用關系,如下圖所示:

avformat_open_input函數根據輸入的文件名,與rtsp_read_packet關聯。

rtsp_read_packet完成每個rtp包的讀取和解析,讀取主要是利用rtp_read從緩沖區獲取數據,解析主要是根據rtp協議,解析rtp包,得到h264碼流數據,由rtp_parse_packet完成。

av_read_frame讀取一幀數據的avpacket包,主要是調用rtsp_read_packet讀取h264碼流數據包,然后由av_parser_parse2組成h264 碼流包,最終組成一幀數據的avpacket。

錯誤測試:發布不同分辨率的rtsp視頻流,測試錯誤產生的原因。

利用VLC發布視頻的rtsp服務,經測試,同一種視頻封裝格式,分辨率越小,花屏現象越少。

分辨率越小,服務端發送給客戶端的數據越小,其花屏現象越少,說明花屏現象與服務端發送的數據量有關。

可能的原因是服務端發送的數據量較大時,客戶端緩沖區不足,導致數據丟失的問題,從而引起花屏現象。

錯誤驗證:修改ffmpeg源碼,輸出客戶端接收的數據包信息,驗證是否存在數據丟失的問題。

源碼修改如下圖所示,主要是輸出RTP包的序號,根據序號判斷是否存在丟包問題。

信息輸出結果如下圖所示,正常情況下,RTP的序號是連續的,而由輸出信息可知RTP序號不連續,因而存在丟包的問題。

解決方法:增加客戶端接收數據的緩沖區,避免丟包現象的產生。

源碼修改如下圖所示,主要是將UDP_MAX_PKT_SIZE增大了10倍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM