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()

参考:

http://blog.csdn.net/leixiaohua1020/article/details/44226355

转载于:https://www.cnblogs.com/elesos/p/6869037.html

FFmpeg编码详细流程相关推荐

  1. 【Qt+FFmpeg】 - FFmpeg解码详细流程

    目录 一:视频解码流程 二:FFMPEG解码流程 三:FFmpeg解码函数 四:FFmpeg解码的数据结构 五:FFmpeg数据结构简介 六:FFmpeg数据结构分析 七:像素数据转换 八:FFMPE ...

  2. 264编码基本概念 FFMpeg的解码流程

    下面转自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8楼 1.NAL.Slice与fr ...

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

    转自:http://www.cocoachina.com/ios/20161214/18225.html 导读 11.22号要申请苹果公司开发者账号,所以当天下午申请了邓白氏编码,昨天邓白氏编码下来了 ...

  4. iOS-申请邓白氏编码的超详细流程介绍--申请苹果公司开发者账号流程所需

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

  5. 201205阶段二FFmpeg编码

    目录 一.学习的知识点 FFMpeg编码流程 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知识点 FFMpeg编码流程 注册 猜编码器格式 创建视频流 找到对应编码器 打开编码输 ...

  6. 【FFmpeg编码实战】(2)将YUV420P图片集编码成H.264视频文件(方法二)

    [FFmpeg编码实战](2)将YUV420P图片集编码成H.264视频文件(方法二) 一.编码成 H.264 视频文件,运行结果 二.编码成 MPEG4 视频文件,运行结果 三.编码成 AV_COD ...

  7. FFMPEG编码实现:pcm编码为acc

    本程序流程: 1.创建输出码流的上下文AVFormatContext,并初始化 2.打开输出文件:avio_open2() 3.创建新流:avformat_new_stream()   //用于保存音 ...

  8. 爬取医药卫生知识服务系统的药品数据——超详细流程

    爬取医药卫生知识服务系统的药品数据--超详细流程 文章目录 爬取医药卫生知识服务系统的药品数据--超详细流程 前言 一.寻找药品数据 二.爬取药品ID 1.资源获取 2.数据提取 3.资源保存 4.主 ...

  9. FFMpeg的解码流程

    FFMpeg的解码流程 1. 从基础谈起 先给出几个概念,以在后面的分析中方便理解 Container:在音视频中的容器,一般指的是一种特定的文件格式,里面指明了所包含的 音视频,字幕等相关信息 St ...

  10. 视频直播流程以及ffmpeg编解码流程

    去年最流行的非视频直播莫属,出现了几百家的直播平台,毕竟自己也是在直播平台做开发的,然后就写一篇关于直播的文章.这里只说流程,具体的实现就不说了,应付面试应该还是可以的. 先上一张简单的流程图: 上面 ...

最新文章

  1. iOS 11开发教程(二十)iOS11应用视图美化按钮之设置按钮的状态
  2. Hystrix文档-实现原理
  3. git linux 登陆_Git安装及基础命令
  4. 汽车新零售转型之路怎么走?你需要知道这些
  5. 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
  6. nginx日志中文变成类型\xE9\xA6\x96\xE9\xA1\xB5-\xE6\x8E\xA8\xE8\x8D\x90的东西
  7. 【转】1.SharePoint服务器端对象模型 之 对象模型概述(Part 1)
  8. 垂直串联六关节机器人调试手册_工业机器人有哪些应用你知道吗?
  9. 计算机图形学颜色表示,计算机图形学 颜色表示模型.ppt
  10. MOSFET(一):基础
  11. 具体数学-第3课(递归式转化为求和求解)
  12. C++中对sprintf()
  13. 关注程序员健康,使用中医十二经络来解释一个神奇的梦境!
  14. shell脚本造数据
  15. 基于android的酒店客房预订客户端app
  16. require.js的简单使用
  17. “独立站+私域”的DTC直客模式电商,是告别互联网内卷唯一有效方式
  18. Python基础教程:拼接字符串的7种方法
  19. 熊猫烧香病毒完整解决方案
  20. C语言十六进制转八进制

热门文章

  1. python中 os._exit() 和 sys.exit(), exit(0)的用法和区别
  2. Docker零基础入门指南(一):Docker介绍
  3. python之函数(function)
  4. IntelliJ IDEA 13怎么创建JAVA SE项目
  5. HDU today(最短路径)
  6. 系统调用getopt解析
  7. 使用python可以实现科学计算吗_使用Python进行科学计算:NumPy入门
  8. linux服务器上svn的log_Linux 下 SVN 常用操作命令详解
  9. word 编辑域中的汉字_神器!10秒在word中编辑复杂数学公式,不用mathtype也行!...
  10. python的命名空间_python的命名空间