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,注册文件名为XXXEXTM3U,对应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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值