av_read_frame在ffmpeg内部包含两个层次的读:
1. 解封装的读,根据封装协议如flv或者mp4,调用相关注册接口(AVInputFormat结构的回调函数), 其返回的是一个AVPacket结构;
2. 解协议的读,根据网络传输协议如http或rtmp或ykstream,调用相关注册接口(URLProtocol),其返还的是一个size大小的buf;
3. 这两层读的中间,就包含了一层avio的调用;
ffmpeg read flow:
demuxer: flv_read_packet ==>
avio: avio_rxx ==>
URLContext: ffurl_read ==>
protocol: rtmpe, http
avio总结:
avio在ffmpeg中,相当于一个中间缓冲数据层,解复用的接口调用avio,avio则调用具体协议的(如http,rtmp)接口读写数据;
avio的具体使用和作用,可参考avio.h的注释说明
ffmpeg的回调中断函数:
在ffmpeg初始化的时候,可以注册一个中断回调函数:
如果设置此函数返回值为1,则av_read_frame函数会中断处理,立即返回;
如果设置此函数返回值为0,则无其他影响;
av_read_frame调用函数分析:
1. 第一次调用av_read_frame,注册文件名为PLSEXTM3U,对应read_packet函数为xxpl_read_packet
2. 在xxpl_read_packet中,第二次调用av_read_frame,对应的read_packet函数为flv_read_packet
av_read_frame
ff_read_packet
s->iformat->read_packet
xxpl_read_packet
av_read_frame
ff_read_packet
s->iformat->read_packet (utils.c)
flv_read_packet (flvdec.c)
av_read_frame
avio_seek (| avio_r8)
fill_buffer (aviobuf.c) read_packet
read_packet = xxpl_read_packet
ffurl_read (avio.c)
retry_transfer_wrapper(h, buf, size, 1, h->prot->url_read);
url_read = rtmp_read (rtmpeproto.c)
get_packet (rtmpeproto.c)
ff_rtmp_packet_read (rtmppkt.c)
ff_rtmp_packet_read_internal
ffurl_read (avio.c)
rtmp_packet_read_one_chunk
ffurl_read_complete | ffurl_read
retry_transfer_wrapper
h->prot->url_read
avio_r8
fill_buffer (aviobuf.c) read_packet
read_packet = tcp_read