ijk緩存

ijk是在ijkiocache.c中開啟緩存的:

ijkio_cache_read()函數(shù)是讀取視頻數(shù)據(jù)的方法,包括網(wǎng)絡(luò)讀取和文件讀??;下面是ijkio_cache_read函數(shù)的主要內(nèi)容:

?if (c->cache_file_close) { ?//是緩存讀關(guān)閉了還是寫關(guān)閉了?應(yīng)該是寫

? ? ? ? return?wrapped_url_read(h, dest, to_read); //如果緩存關(guān)閉了,就從網(wǎng)絡(luò)讀取

? ? }

?if (!c->cache_file_forwards_capacity) {?

? ? ? ? ret =ijkio_cache_sync_read(h, buf, size); //如果沒有設(shè)置cache_file_forwards_capacity就開啟同步讀,否則從本地文件讀取

? ? ? ? if(ret >=0) {

? ? ? ? ? ? c->read_logical_pos+= ret;

? ? ? ? }

? ? ? ? call_inject_statistic(h);

? ? ? ? return?(int)ret;

? ? }

ijkio_cache_sync_read():

先判讀能不能從文件讀;如果不能就從網(wǎng)絡(luò)加載,如果從網(wǎng)絡(luò)加載會調(diào)用wrapped_url_read讀取并且會調(diào)用sync_add_entry往本地寫入,sync_add_entry會調(diào)用write(c->fd, buf, size)方法;

cache_file_forwards_capacity:向前緩存的大小,比如1M,如果cache_file_forwards_capacity大于0那么ijkio_cache_task也會開啟寫緩存操作,那么上面的緩存寫就不生效了

IjkIOCacheContext和IjkCacheEntry詳解:

IjkIOCacheContext:

logical_size-文件大小,read_logical_pos已讀緩存大小,read_inner_pos-讀的網(wǎng)絡(luò)的位置,io_eof_reached讀到緩存末尾,cache_physical_pos-已經(jīng)緩存到的位置,last_physical_pos-上一次緩存的位置,only_read_file-初始化時設(shè)置、只讀不寫模式

IjkCacheEntry:

描述了進入時開始進入緩存的位置,logical_pos-進入時的邏輯位置,physical_pos-進入時的實際位置,size-已經(jīng)緩存的大小

?ijkio_cache_sync_read是進行讀操作的函數(shù):?int64_t physical_target = entry->physical_pos+ in_block_pos; //計算緩存開始讀取的位置

IjkCacheEntry,IjkCacheTreeInfo,IjkAVTreeNode:

IjkCacheTreeInfo包含一個根root?IjkAVTreeNode,IjkAVTreeNode中的elem是IjkCacheEntry類型;

IjkCacheTreeInfo中的值分別是hyu文件中tree_開頭的的,IjkCacheEntry中的值是hyu中entry_開頭的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容