(1)init_input_stream():当中调?了avcodec_open2()打开编码器 。
(2)init_output_stream() 。
(3)av_dump_format()在屏幕上打印输出格式信息 。注意是输出格式的信息 。输?格式的信息的打印是在parse_options()函数运?过程中调?opt_input_file()的时候打印到屏幕上 。
(4)avformat_write_header():写输出?件的?件头 。
transcode_step()调?了例如以下函数:
(1)process_input():完成解码?作 。
(2)transcode_from_filter():未分析 。
(3)reap_filters():完成编码?作 。
(4)process_input()流程图如下所示:

文章插图
get_input_packet():获取?帧压缩编码数据,即?个AVPacket 。当中调?了av_read_frame() 。
output_packet():解码压缩编码的数据并将之送?AVFilterContext 。
output_packet()调?了例如以下函数:
decode_video():解码?帧视频(?个AVPacket) 。
decode_audio():解码?频(并不?定是?帧,是?个AVPacket) 。
do_streamcopy():假设不需要??次编码的话,则调?此函数,?般?于封装格式之间的转换 。速度?转码快?常多 。
decode_video()调?了例如以下函数:
avcodec_decode_video2():解码?帧视频 。
rate_emu_sleep():要求依照帧率处理数据的时候调? 。能够避免FFmpeg处理速度过快 。经常使?于?络实时流的处理(RTP/RTMP流的推送) 。
configure_filtergraph():设置AVFilterGraph 。
av_buffersrc_add_frame():将解码后的数据(?个AVFrame)送?AVFilterContext 。
decode_audio()调?的函数和decode_video()基本?样 。唯?的不同在于其解码?频的函数是avcodec_decode_audio4() 。
reap_filters():主要完成了编码的工作 。
其函数调?结构例如以下图:

文章插图
reap_filters()调?了例如以下函数:
av_buffersink_get_buffer_ref():从AVFilterContext中取出?帧解码后的数据(结构为AVFilterBufferRef 。能够转换为AVFrame) 。
avfilter_copy_buf_props():AVFilterBufferRef转换为AVFrame 。
do_audio_out():编码?频 。
do_video_out():编码视频 。do_video_out()调?了例如以下函数:
avcodec_encode_video2():编码?帧视频 。
write_frame():写?编码后的视频压缩数据 。
write_frame()调?了例如以下函数:
av_bitstream_filter_filter():使?AVBitStreamFilter的时候 。会调?此函数进?处理 。
av_interleaved_write_frame():写?压缩编码数据 。
avfilter_unref_buffer():释放资源 。
do_audio_out()调?的函数与do_video_out()基本上?样 。唯?的不同在于视频编码函数 。
avcodec_encode_video2()变成了?频编码函数avcodec_encode_audio2() 。
exit_program()主要完成了清理?作 。调?关系例如以下图:

文章插图
调?了如以下函数:
avfilter_graph_free():释放AVFilterGraph 。
avformat_free_context():释放输出?件的AVFormatContext 。
【超详细ffmpeg.c框架分析】av_bitstream_filter_close():关闭AVBitStreamFilter 。
avformat_close_input():关闭输??件 。
4.附加部分
(1)解析命令行ffmpeg_parse_options 。
(2)打开输入文件 。
(3)打开输出文件 。
(4)读取输入文件,av_read_frame 。函数调用栈如下:

文章插图
(5)编解码
解码:avcodec_send_packet 。
编码:avcode_send_frame 。
解码video:

文章插图

文章插图
解码audio:

文章插图
(6)将packet写入输出文件
avformat_write_header:写入头部 。
av_interleaved_write_frame:写入packet 。
av_write_trailer:写入尾部 。

文章插图
本篇文章就分享到这里,欢迎关注,点赞,转发,收藏 。
推荐阅读
- 超市促销员销售技巧有哪些
- 马超在羌人的地位 马超临终前对刘备说了些什么
- 劉寄奴酒的功效与作用
- 佛罗伦萨桌游的详细介绍
- 腰鼓是一种什么乐器 腰鼓的详细介绍
- SQL Server2000安装步骤详细介绍解读新人也会装了
- 每个算法人员都应该知道的4个超参数调试方法
- 超详细解析FFplay之数据读取线程
- 海盐奶茶做法,奶茶的详细做法
- 孕囊超过23厘米药流会怎样
