VLC接收網路串流緩衝時間的計算

2021-06-05 21:20:06 字數 2372 閱讀 5763

vlc版本2.0.1

1、最初的線索:

[0xb73005f0] main input debug: buffering 0%

[0xb73005f0] main input debug: buffering 3%

[0xb73005f0] main input debug: buffering 6%

[0xb73005f0] main input debug: buffering 9%

[0xb73005f0] main input debug: buffering 12%

[0xb73005f0] main input debug: buffering 15%

[0xb73005f0] main input debug: buffering 18%

[0xb73005f0] main input debug: buffering 21%

[0xb73005f0] main input debug: buffering 24%

[0xb73005f0] main input debug: buffering 27%

可以查詢到這個緩衝過程的列印是從src/input/es_out.c:658行輸出的。函式esoutdecodersstopbuffering的作用是判斷當前緩衝流的長度i_stream_duration是否達到預置的i_buffering_duation長度,是則停止緩衝,否則返回等待。

接下來是查i_stream_duration和i_buffering_duation如何計算。

2、i_stream_duration的計算:

在esoutdecodersstopbuffering中,i_stream_duration是通過input_clock_getstate來獲取。而input_clock_getstate是取乙個型別為input_clock_t物件的倆個clock_point_t物件成員last和ref的i_stream的差值作為已緩衝資料的長度。

繼續查詢i_stream值的計算,可以發現i_stream只有在clock_point_create中進行的設定,而last和ref物件的i_stream值是在input_clock_update中做了更新,而用於更新i_stream的資料由i_ck_stream傳入。input_clock_update函式的呼叫位於es_out.c:2324行,該段**用於設定input_clock_t物件的pcr值,上層傳入的命令是es_out_set_group_pcr,傳入此命令的函式只有乙個ts.c:2173行的pcrhandle。

查pcrhandle的**可知,pcr的計算是直接從ts包中獲取adaption欄位的pcr資料,按照90khz的時鐘轉換為秒,並乘以1000000換算成微秒,傳遞給input_clock_update,到此完成了i_stream_duration的計算。

3、i_buffering_duration的計算:

在esoutdecodersstopbuffering中,i_buffering_duration是乙個es_out_sys_t物件的i_pts_delay屬性再加上另外幾個引數來確定。這裡我只研究了i_pts_delay的獲取,在我的測試中,其餘幾個值均為0。

es_out_sys_t物件是esoutdecodersstopbuffering的es_out_t型引數out傳入的,回溯**的呼叫過程,esoutdecodersstopbuffering <-esoutcontrollocked <-esoutcontrol <-es_out_vacontrol <-es_out_control <-cmdexecutecontrol,在這裡out換成了另乙個es_out_t型引數p_out,繼續回溯,cmdexecutedcontrol <-controllocked <-control <-es_out_vacontrol <-es_out_control <-pcrhandle,這裡的p_out是demux_t型引數p_demux的成員,pcrhandle <-gatherpes <-demux <-demux_demux <-mainloopdemux,這裡的p_demux是input_thread_t型物件p_input成員,再回溯,mainloopdemux <-mainloop <-run,p_input在input.c:550行通過init函式初始化。

再讀init部分**,可以發現在input.c:1258行initsourceinit函式後,i_pts_delay的值發生變化,往下深入,會發現在input.c:2644行,有乙個access_get_pts_delay操作,最終對應到我的測試中是udp.c:173行,vlc獲取了乙個叫做:network-caching引數的值,這個值配置的是1000,我猜測應該是ms,返回時又乘以了1000,轉換為微秒,準備與i_stream_duration值進行比較。

總結:讀了許久的ts協議,在實際應用中才發現許多東西跟想像的都不同,脫離實際的空想終究是不能成事的。

接收網路資料報

接收網路資料報一種好的方法就是可以建立套介面 位元組緩衝 來對網路資料先進行緩衝再在以後進行處理 由於接收的資料報是位元組連續的,所以需要設定一塊一塊連續的記憶體塊來儲存網路資料報,因而必須設定記憶體塊的大小 const unsigned int trunksize 64 1024 一般網路資料比較...

Android 7 0無法接收網路變化廣播

我到官網檢視7.0的變化發現果然是7.0系統做了優化 project svelte 後台優化 android 7.0 移除了三項隱式廣播,以幫助優化記憶體使用和電量消耗。此項變更很有必要,因為隱式廣播會在後台頻繁啟動已註冊偵聽這些廣播的應用。刪除這些廣播可以顯著提公升裝置效能和使用者體驗。移動裝置會...

乙個簡單的接收網路資料程式

include include include include include include include include include include include define socket error 1 define invalid socket 1 int createlisten...