什么情况下视频会存储在代码中?
在没有文件系统时或者内存紧缺时,就需要把视频资源转成常量数组直接编译到代码中。
实现
实现方式
将常量数组分块放入内存,再从内存中读取数据。
从内存中读取数据
在 avformat_open_input()
之前初始化一个 AVIOContext
,而且将原本的 AVFormatContext
的指针pb( AVIOContext
类型)指向这个自行初始化 AVIOContext
。当自行指定了 AVIOContext
之后,avformat_open_input()
里面的 URL 参数就不起作用了(URL类型还是起作用的,最好填 NULL
或 ""
)。
#define ASSET_BUFFER_SIZE (32 * 1024) /* 内存块大小 */
AVFormatContext *ic = NULL;
ic = avformat_alloc_context();
ic->pb = avio_alloc_context((unsigned char*)av_malloc(ASSET_BUFFER_SIZE), ASSET_BUFFER_SIZE, 0,
is /* 回调函数上下文 */,
read_asset /* 读取数据的回调函数指针 */,
NULL /* 输出数据的回调函数指针 */,
seek_asset /* 定位数据的回调函数指针 */);
avformat_open_input(&ic, ""/* URL */, NULL, NULL);
/* 省略... */
exit:
if (ic) avformat_close_input(&ic);
读取视频
以下是读取文件线程的代码:
#define ASSET_BUFFER_SIZ