FFmpeg在编码一个视频的时候的函数调用流程。为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数。

函数背景色

函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:

粉红色背景函数:FFmpeg的API函数。

白色背景的函数:FFmpeg的内部函数。

黄色背景的函数:URLProtocol结构体中的函数,包含了读写各种协议的功能。

绿色背景的函数:AVOutputFormat结构体中的函数,包含了读写各种封装格式的功能。

蓝色背景的函数:AVCodec结构体中的函数,包含了编解码的功能。

区域

整个关系图可以分为以下几个区域:

左边区域——架构函数区域:这些函数并不针对某一特定的视频格式。

右上方黄色区域——协议处理函数区域:不同的协议(RTP,RTMP,FILE)会调用不同的协议处理函数。

右边中间绿色区域——封装格式处理函数区域:不同的封装格式(MKV,FLV,MPEG2TS,AVI)会调用不同的封装格式处理函数。

右边下方蓝色区域——编解码函数区域:不同的编码标准(HEVC,H.264,MPEG2)会调用不同的编解码函数。

箭头线

为了把调用关系表示的更明显,图中的箭头线也使用了不同的颜色:

红色的箭头线:标志了编码的流程。

其他颜色的箭头线:标志了函数之间的调用关系。其中:

调用URLProtocol结构体中的函数用黄色箭头线标识;

调用AVOutputFormat结构体中的函数用绿色箭头线标识;

调用AVCodec结构体中的函数用蓝色箭头线标识。

函数所在的文件

每个函数标识了它所在的文件路径。

函数功能简述

下面简单列出几个区域中函数之间的调用关系(函数之间的调用关系使用缩进的方式表现出来)。

左边区域(架构函数)

1. av_register_all()

1) avcodec_register_all()

(a) REGISTER_HWACCEL()

(b) REGISTER_ENCODER()

(c) REGISTER_DECODER()

(d) REGISTER_PARSER()

(e) REGISTER_BSF()

2) REGISTER_MUXER()

3) REGISTER_DEMUXER()

4) REGISTER_PROTOCOL()

2. avformat_alloc_output_context2()【函数简单分析

1) avformat_alloc_context()

(a) av_malloc(sizeof(AVFormatContext))

(b) avformat_get_context_defaults()

a) av_opt_set_defaults()

2) av_guess_format()

(a) av_oformat_next()

(b) av_match_name()

(c) av_match_ext()

3. avio_open2()【函数简单分析

1) ffurl_open()

(a) ffurl_alloc()

a) url_find_protocol()

b) url_alloc_for_protocol()

(b) ffurl_connect()

a) URLProtocol->url_open()

2) ffio_fdopen()

(a) av_malloc(buffer_size)

(b) avio_alloc_context()

a) av_mallocz(sizeof(AVIOContext))

b) ffio_init_context()

4. avformat_new_stream()【函数简单分析

1) av_mallocz(sizeof(AVStream))

2) avcodec_alloc_context3()

(a) av_malloc(sizeof(AVCodecContext))

(b) avcodec_get_context_defaults3()

5. avcodec_find_encoder()【函数简单分析

1) find_encdec()

6. avcodec_open2()【函数简单分析

1) AVCodec->init()

7. avformat_write_header()【函数简单分析

1) init_muxer()

2) AVOutputFormat->write_header()

3) init_pts()

8. avcodec_encode_video2()【函数简单分析

1) AVCodec->encode2()

9. av_write_frame()【函数简单分析

1) check_packet()

2) compute_pkt_fields2()

3) write_packet()

(a) AVOutputFormat->write_packet()

10. av_write_trailer()【函数简单分析

1) write_packet()

2) AVOutputFormat->write_trailer()

11. avcodec_close()【函数简单分析

1) AVCodec->close()

12. avformat_free_context()【函数简单分析

1) ff_free_stream()

13. avio_close()【函数简单分析

1) avio_flush()

(a) flush_buffer()

2) ffurl_close()

(a) ffurl_closep()

a) URLProtocol->url_close()

右上区域(URLProtocol协议处理函数)

URLProtocol结构体包含如下协议处理函数指针:

url_open():打开

url_read():读取

url_write():写入

url_seek():调整进度

url_close():关闭

【例子】不同的协议对应着上述接口有不同的实现函数,举几个例子:

File协议(即文件)对应的URLProtocol结构体ff_file_protocol:

url_open() -> file_open() -> open()

url_read() -> file_read() -> read()

url_write() -> file_write() -> write()

url_seek() -> file_seek() -> lseek()

url_close() -> file_close() -> close()

RTMP协议(libRTMP)对应的URLProtocol结构体ff_librtmp_protocol:

url_open() -> rtmp_open() -> RTMP_Init(), RTMP_SetupURL(), RTMP_Connect(), RTMP_ConnectStream()

url_read() -> rtmp_read() -> RTMP_Read()

url_write() -> rtmp_write() -> RTMP_Write()

url_seek() -> rtmp_read_seek() -> RTMP_SendSeek()

url_close() -> rtmp_close() -> RTMP_Close()

UDP协议对应的URLProtocol结构体ff_udp_protocol:

url_open() -> udp_open()

url_read() -> udp_read()

url_write() -> udp_write()

url_seek() -> udp_close()

url_close() -> udp_close()

右中区域(AVOutputFormat封装格式处理函数)

AVOutputFormat包含如下封装格式处理函数指针:

write_header():写文件头

write_packet():写一帧数据

write_trailer():写文件尾

【例子】不同的封装格式对应着上述接口有不同的实现函数,举几个例子:

FLV封装格式对应的AVOutputFormat结构体ff_flv_muxer:

write_header() -> flv_write_header()

write_packet() –> flv_write_packet()

write_trailer() -> flv_write_trailer()

MKV封装格式对应的AVOutputFormat结构体ff_matroska_muxer:

write_header() -> mkv_write_header()

write_packet() –> mkv_write_flush_packet()

write_trailer() -> mkv_write_trailer()

MPEG2TS封装格式对应的AVOutputFormat结构体ff_mpegts_muxer:

write_header() -> mpegts_write_header()

write_packet() –> mpegts_write_packet()

write_trailer() -> mpegts_write_end()

AVI封装格式对应的AVOutputFormat结构体ff_avi_muxer:

write_header() -> avi_write_header()

write_packet() –> avi_write_packet()

write_trailer() -> avi_write_trailer()

右下区域(AVCodec编解码函数)

AVCodec包含如下编解码函数指针:

init():初始化

encode2():编码一帧数据

close():关闭

【例子】不同的编解码器对应着上述接口有不同的实现函数,举几个例子:

HEVC编码器对应的AVCodec结构体ff_libx265_encoder:

init() -> libx265_encode_init() -> x265_param_alloc(), x265_param_default_preset(), x265_encoder_open()

encode2() -> libx265_encode_frame() -> x265_encoder_encode()

close() -> libx265_encode_close() -> x265_param_free(), x265_encoder_close()

H.264编码器对应的AVCodec结构体ff_libx264_encoder:

init() -> X264_init() -> x264_param_default(), x264_encoder_open(), x264_encoder_headers()

encode2() -> X264_frame() -> x264_encoder_encode()

close() -> X264_close() -> x264_encoder_close()

VP8编码器(libVPX)对应的AVCodec结构体ff_libvpx_vp8_encoder:

init() -> vpx_init() -> vpx_codec_enc_config_default()

encode2() -> vp8_encode() -> vpx_codec_enc_init(), vpx_codec_encode()

close() -> vp8_free() -> vpx_codec_destroy()

MPEG2编码器对应的AVCodec结构体ff_mpeg2video_encoder:

init() -> encode_init()

encode2() -> ff_mpv_encode_picture()

close() -> ff_mpv_encode_end()

参考:

FFmpeg编码详细流程的更多相关文章

  1. FFmpeg解码详细流程

    FFmpeg在解码一个视频的时候的函数调用流程.为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数. 下面解释一下图中关键标记的含义. 函数背景色 函数在图中以方框的形式表现出来 ...

  2. iOS-申请邓白氏编码的超详细流程介绍

    导读 11.22号要申请苹果公司开发者账号,所以当天下午申请了邓白氏编码,昨天邓白氏编码下来了,这里就做一下记录,分享给大家. 概览 11.22提交的邓白氏编码申请,11.28(礼拜一)华夏邓白氏发来 ...

  3. USB枚举的详细流程

    附一个很好的枚举过程的详细流程: ◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.◆ 主机检测设备.◆ 集线器使用中断通道将事件报告给主机.◆ 主机发送Get_Port_ ...

  4. USB枚举过程的详细流程

    USB枚举过程的详细流程 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态.主机检测设备.1>Hub使用中断通道将事件报告给Host.2>Host发送Get_Por ...

  5. 微信小程序提交审核并发布详细流程

    微信小程序提交审核并发布详细流程 审核在1小时到N天不等 官方7天,一般3天内 提交审核?如何发布?审核过程中注意事项? 服务器: 域名只支持 https (request.uploadFile.do ...

  6. ios 真机测试与发布详细流程,基于最新的开发者网站,ios7,xcode5(有截图的哦)[[[第一部分真机测试]]]

    转载于:http://blog.csdn.net/lv_ruanruan/article/details/14446597 真机测试及发布详细流程,最新版 第一次一个人搞一个项目,我们老大规定,一个周 ...

  7. POJ 3461 Oulipo[附KMP算法详细流程讲解]

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  8. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程2

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  9. 《转》深入理解Activity启动流程(三)–Activity启动的详细流程1

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

随机推荐

  1. bzoj 4034 [HAOI2015]树上操作 入栈出栈序+线段树 / 树剖 维护到根距离和

    题目大意 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...

  2. Bzoj3747 [POI1015] Kinoman

    Description 共有m部电影,编号为1~m,第i部电影的好看值为w[i]. 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部. 你可以选择l,r(1<=l< ...

  3. 【POJ3498】March of the Penguins(最大流,裂点)

    题意:在靠近南极的某处,一些企鹅站在许多漂浮的冰块上.由于企鹅是群居动物,所以它们想要聚集到一起,在同一个冰块上.企鹅们不想把自己的身体弄湿,所以它们在冰块之间跳跃,但是它们的跳跃距离,有一个上限.  ...

  4. 树上的路径 BZOJ 3784

    树上的路径 [问题描述] 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距 ...

  5. C/C++程序编译运行过程分析(转载)

    为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母.符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M O V”代表数据传递等等,这样一来,人们很容 ...

  6. 输入框为数字类型时防止maxlength属性不起作用

    <input type="number" oninput="if(value.length>5)value=value.slice(0,5)" /& ...

  7. L1-2. 点赞【求多组数据中出现次数最多的】

    L1-2. 点赞 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持.每 ...

  8. Maven修改默认本地资源库文件夹

    默认的Maven地址如下: Linux/Mac:~/.m2(提示:~/为当前用户目录地址) Widnows:C:\Users\{username}\.m2(提示:username为当前用户名) 修改操 ...

  9. fastscripT实现权限控制

    fastscripT权限控制 此处以FASTSCRIPT实现功能权限为例,用脚本实现数据权限也是很方便的. unit Unit1; interface uses Winapi.Windows, Win ...

  10. android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方案

    最近实在受不了eclipse的“迟钝”,准备入手Android studio开发环境,但是貌似不太顺利,成功安装了Android studio,在线更新Android adk的时候,总是遇到如下错误: ...