1. av_read_frame
2. -> read_frame_internal
3. -> ff_read_packet
4. -> (s->iformat->read_packet)
5. -> av_get_packet
6. -> append_packet_chunked
7. -> avio_read
其中,第4步中,(s->iformat->read_packet)是对应的demuxer,比如对于mp4文件用的是mov_read_packet. demuxer会解析出下一帧需要多少byte, av_get_packet负责把需要的数据读出来,放到AVPacket中.
第7步,avio_read中,
- 如果AVIOContext中的数据够,AVPacket从AVIOContext中拷贝数据
- 如果不够,则调用fill_buffer把buffer填满
两个重要的结构:
- AVIOContext: (ffmpeg的源代码里有对这个结构的详细的解释,这里只描述读数据的情况)
-
unsigned char *buffer; buffer的开始地址
-
unsigned char *buf_ptr; buffer的当前位置的指针
-
unsigned char *buf_end; buffer的结束地址
-
int buffer_size; buffer的最大的大小,即已分配的buffer的大小,默认是32768
-
int64_t pos; 当前文件的当前位置
-
- AVPacket:
-
uint8_t *data; 放读取后的数据的地方;一般情况下,等于AVPacket->buf->data;
-
int size; buffer数据的大小
-
AVBufferRef *buf;
-
AVBuffer *buffer; 主要用于记录引用次数
-
uint8_t *data; 一般情况下,等于AVPacket->data
-
int size;
-
-