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_開頭的