1
2
3
4
5
6
7
8
9
10
11
//avio_dir_cmd.c
av_log_set_level();//设置日志等级
avformat_network_init();//GnuTLS和OpenSSL的线程安全考虑 否则就不需要再使用

avpriv_io_move();//移动或者重名
avpriv_io_delete();//删除
avio_open_dir();//打开目录
avio_read_dir();//从目录读取一个条目
avio_free_directory_entry();//关闭条目

avformat_network_deinit();//有avformat_network_init必须有这个进行关闭
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* @file
* libavformat AVIOContext API example.
*
* Make libavformat demuxer access media content through a custom
* AVIOContext read callback.
* @example avio_reading.c
*/
av_file_map();//读取文件到buffer和buffersize
avformat_alloc_context();//分配和初始化封装上下文ctx
av_malloc();//申请一块空间得到ctxbuffer
//bd结构体 包含buffer和buffersize
avio_alloc_context(ctxbuffer, ctxbuffersize,0, &bd, &read_packet, NULL, NULL);//为比特流上下文申请空间 得到avio_ctx
ctx->pb = avio_ctx;
avformat_open_input();//打开流
avformat_find_stream_info();//读文件流信息
av_dump_format();//打印封装上下文
avformat_close_input();//关闭封装上下文并指为NULL
av_freep();//av_malloc()
av_context_free();//关闭比特流上下文
av_file_unmap();//av_file_map()

static int read_packet(void *opaque, uint8_t *buf, int buf_size)//从opaque中读取buf_size长的数据保存在buf
{
struct buffer_data *bd = (struct buffer_data *)opaque;
buf_size = FFMIN(buf_size, bd->size);

if (!buf_size)
return AVERROR_EOF;
printf("ptr:%p size:%zu\n", bd->ptr, bd->size);

/* copy internal buffer data to buf */
memcpy(buf, bd->ptr, buf_size);
bd->ptr += buf_size;
bd->size -= buf_size;

return buf_size;
}