ijk是在ijkiocache.c中开启缓存的:
ijkio_cache_read()函数是读取视频数据的方法,包括网络读取和文件读取;下面是ijkio_cache_read函数的主要内容:
if (c->cache_file_close) { //是缓存读关闭了还是写关闭了?应该是写
return wrapped_url_read(h, dest, to_read); //如果缓存关闭了,就从网络读取
}
if (!c->cache_file_forwards_capacity) {
ret =ijkio_cache_sync_read(h, buf, size); //如果没有设置cache_file_forwards_capacity就开启同步读,否则从本地文件读取
if(ret >=0) {
c->read_logical_pos+= ret;
}
call_inject_statistic(h);
return (int)ret;
}
ijkio_cache_sync_read():
先判读能不能从文件读;如果不能就从网络加载,如果从网络加载会调用wrapped_url_read读取并且会调用sync_add_entry往本地写入,sync_add_entry会调用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-读的网络的位置,io_eof_reached读到缓存末尾,cache_physical_pos-已经缓存到的位置,last_physical_pos-上一次缓存的位置,only_read_file-初始化时设置、只读不写模式
IjkCacheEntry:
描述了进入时开始进入缓存的位置,logical_pos-进入时的逻辑位置,physical_pos-进入时的实际位置,size-已经缓存的大小
ijkio_cache_sync_read是进行读操作的函数: 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_开头的