ffmpeg filter流程

本文章基于ffmpeg3.3.2分析相关概念介绍
AVFilterGraph 包含了本次使用到的所有过滤器
AVFilterContext 过滤器的详细配置
AVFilter_Link 连接两个过滤器
AVFilterPad 用于两个过滤器传递数据

InputStream 流媒体的输入信息 包含了流媒体的格式信息
InputFilter 指示了有了输入包,应该交给的第一个filter来处理

输出跟输入一样不在一一介绍


1、transcode_step主循环
1.1 choose_output 选择时间戳小的输出流
1.2 transcode_from_filter 根据输出流选择所需的输入流,ffmpeg选择输入流的规则是当前缓冲区中没有数据的,迫切需要获取的,选择出来的是输入流下标 ,比如两路流 选择的是0 或1
2、process_input 获取得到的包
3、process_input_packet 处理得到的包,包括区分是视频还是音频包
4、decode_video 解码视频包,将解码的包交给filter处理
5、send_frame_to_filters 找到该解码包的来源 和包交给filter处理
6、ifilter_send_frame 做一些参数的检查,包括过滤器链表有没有初始化,没有的化先初始化,找到处理该包的第一个过滤器,第一个过滤器一定是buffersrc, ffmpeg自带的,由这个过滤器传给自己ffmpeg 参数带的第一个过滤器,这相当于一个入口
7、av_buffersrc_add_frame_flags 复制下解码包交给av_buffersrc_add_frame_internal
8、av_buffersrc_add_frame_internal
8.1 av_fifo_generic_write将解码包写入buffersrc的队列里面
8.2 ctx->output_pads[0].request_frame(ctx->outputs[0])) output_pads[0] 就是AVFilterPad ,调用request_frame将数据传给下一个过滤器,也就是我们ffmpeg 参数中的第一个过滤器
8.2.3 av_fifo_size 判断缓冲区中有没有数据,这个缓冲区指的是buffersrc的,没有c->nb_failed_requests++;这个值挺重要,因为在transcode_from_filter 里面选择输入时就是根据这个值来选择的
8.2.4 av_fifo_generic_read缓冲区中读解码的包
8.2.5 ff_filter_frame 这个函数特别重要,用于两个filter 包的传递,该函数将包放入输出filter_link,另一个函数负责从输出filter_link取出,在下面介绍,函数ff_filter_set_ready(link->dst, 300)比较重要,设置了filter中ready的值,该值属于一个优先级的判断,好好理解一下
9、push_frame 开始处理包,是一个循环,只要有filter 的ready值 大于0需要处理
10、ff_filter_graph_run_once 选择ready最大的filter激活
11、ff_filter_activate选择激活函数默认ff_filter_activate_default
12、ff_filter_activate_default
13、ff_filter_frame_to_filter 处理filter,传入的参数是该filter的输入filter_link,假如该filter是ffmpeg参数的第一个filter,也就是我们配置的filter,那么它前面的filter有可能就是buffersrc,在8.2.5,buffersrc将frame写进了它输出 filter_link的队列,在这里就可以取出
13.1 ff_inlink_consume_frame取出link队列的frame
13.2 ff_filter_frame_framed 将frame 传到该filter
13.2.1 ff_inlink_process_commands没详细看
13.2.2 filter_frame 调用该filter的filter_frame 方法,在这之中对frame进行处理,处理完后调用8.2.5 ff_filter_frame将处理h后的frame继续传递给下一个过滤器
14、forward_status_change
15、ff_request_frame_to_filter

下面为合并两个视频流的ffmpeg命令
ffmpeg -i rtmp://127.0.0.1/test/4070415 -i rtmp://127.0.0.1/test/4043625 -filter_complex "[0:v]crop=w=iw*3/4:h=ih:x=0:y=0,crop=w=iw*2/3:h=ih:x=iw/3:y=0[a];1:v]crop=w=iw*3/4:h=ih:x=0:y=0,crop=w=iw*2/3:h=ih:x=iw/3:y=0[b];[a]pad=w=iw*2:h=ih:x=0:y=0[c];[c][b]overlay=main_w/2:0[vd];[0:a][1:a]amix=inputs=2:duration=first[aout]" -map "[aout]" -map "[vd]" -b:v 500k -f flv -y rtmp://127.0.0.1/test/12345

其中[0:v] 第一路视频流   [1:v]第二路视频流   [0:a]第一路音频流   [1:a]第二路音频流,crop为裁剪过滤器先裁剪右边的1/4,然后裁剪剩下的左边的1/3,剩下原视频中间的1/2输出为[a],第二路输出为[b], pad为填充过滤器,将[a]扩展一倍。overlay为覆盖过滤器,将[b]填充到[a]扩展的部分,完成视频合并,音频合并采用amix,将两路音频流合并




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值