FFmpeg编码详细流程



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






函数背景色

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

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

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

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

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

蓝色背景的函数: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))

FFmpeg是一个开源的跨平台多媒体框架,它可以处理视频、音频以及流媒体等多种不同的媒体格式。在使用FFmpeg进行媒体处理的过程中,编解码是其中最为核心的部分之一。下面我们将通过图文的形式,详细讲解FFmpeg的编解码流程。 1. 媒体文件解析 在进行编解码之前,首先需要对媒体文件进行解析,获取媒体文件的基本信息以及相关的参数。对于视频文件,需要获取视频的分辨率、帧率、编码格式等信息;对于音频文件,需要获取音频的采样率、声道数、编码格式等信息。 2. 解码器初始化 FFmpeg中的解码器用于将媒体文件中的编码数据解码成原始数据。在进行解码之前,需要先对解码器进行初始化,包括选择合适的解码器、设置解码器参数等。 3. 解码数据 解码器初始化完成后,可以开始对媒体文件中的编码数据进行解码。解码器会将编码数据解码成原始数据,包括视频帧和音频样本等。 4. 编码器初始化 在进行编码之前,需要对编码器进行初始化,包括选择合适的编码器、设置编码器参数等。编码器用于将原始数据编码成压缩数据,以便于在传输、存储等环节中进行处理。 5. 编码数据 编码器初始化完成后,可以开始对原始数据进行编码编码器会将原始数据编码成压缩数据,包括视频帧和音频样本等。 6. 数据封装 在编码完成后,需要对压缩数据进行封装,生成标准的媒体格式。对于视频文件,常见的媒体格式包括MP4、AVI、FLV等;对于音频文件,常见的媒体格式包括MP3、WAV等。 7. 输出数据 封装完成后,可以将生成的媒体文件输出到指定的位置,包括本地文件、网络流等。 总体来说,FFmpeg的编解码流程可以分为媒体文件解析、解码器初始化、解码数据、编码器初始化、编码数据、数据封装和输出数据等七个步骤。通过这些步骤,可以将不同格式的媒体文件进行编解码处理,实现多媒体处理的各种需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值