av_read_frame 主要执行函数

1. av_read_frame

2. -> read_frame_internal

3. -> ff_read_packet

4. -> (s->iformat->read_packet) ,相当于调用flv_read_packet,AVInputFormat,这一步完成了AVFormatContext到AVIOContext格式
5. -> av_get_packet ,(AVIOContext *s, AVPacket *pkt, int size)

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中,在libavformat/aviobuf.c中

  1. 如果AVIOContext中的数据够,AVPacket从AVIOContext中拷贝数据
    1、read_packet_wrapper
    2、 →read_packet ,(void *opaque, uint8_t *buf, int buf_size)
    3、 →memcpy ,memcpy指的是c和c++使用的内存拷贝函数,(void *dest, const void *src, size_t n)memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

  2. 如果不够,则调用fill_buffer把buffer填满
    1、read_packet_wrapper
    2、→ len = s->read_packet(s->opaque, buf, size);
    http://blog.csdn.net/xiruanliuwei/article/details/27376697,这一步完成了AVIOContext到URLContext的格式转化。每一次格式转换都会经历一次方法的muxer或demuxer。

实际会调用ffurl_read函数
3、retry_transfer_wrapper
4、rtmp_read或http_read 或file_read

1、http://blog.csdn.net/tomorrow_opal/article/details/54670153

2、https://my.oschina.net/u/2326611/blog/800675

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。