ffmpeg的av_read_frame杂记

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

你可能感兴趣的:(音视频开发)