当前位置:   article > 正文

FFMPEG框架结构

ffmpeg框架


整体架构

1、AVUtil: 核心工具库,许多其他模块都会依赖该库做一些基本的音视频处理操作,如log信息、版本信息等。
  2、AVFormat: 文件格式和协议库,封装了Protocol层和Demuxer、Muxer层。其中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
  3、AVCodec: 编解码库,封装了Codec库,AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。默认不会添加libx264、libfdk_aac等三方库的,但可以插件形式添加,然后提供统一接口。
  4、AVFilter: 提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出,提供滤镜管道服务,例如视频的缩放、旋转、裁剪和拼接,音频重采样。
  5、AVDevice: 音视频设备的录制和播放服务,例如列出可用设备,录制摄像头,播放视频等
  6、SwrRessample: 该模块可用于音频重采样,可以对数字音频进行声道数、数据格式、采样率、等多种基本信息的转换,同时支持音频通道布局转换与布局调整。
  7、SWScale: 提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。
  8、PostProc: 该模块可用于进行后期处理,当我们使用AVFilter的时 候需要打开该模块的开关,因为Filter中会使用到该模块的一些基础函数。

音视频播放流程


解码相关函数简介

avformat_alloc_context:用于创建AVFormatContext对象
avformat_open_input:打开视频输入文件
avformat_find_stream_info():获取视频文件信息
avcodec_find_decoder():查找解码器
avcodec_open2():打开编解码器
av_read_frame():从输入文件读取一帧压缩数据
avcodec_decode_video2():解码一帧视频数据
avcodec_decode_audio4():解码一帧音频数据
avcodec_close():关闭解码器
avcodec_send_packet():发送待解码的数据包
avcodec_receive_frame():接收解码后的帧

数据结构简介

AVFormatContext

封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。

AVInputFormat(拆分音视频流) AVOutputFormat(合成文件)

每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

AVStream

视频文件中每个视频(音频)流对应一个该结构体。

AVCodecContext

编解码器上下文结构体,保存了视频(音频)编解码相关信息。

AVCodec

每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

AVPacket

存储一帧或多帧(音频)压缩编码数据。

AVFrame

存储一帧解码后像素(采样)数据。

重点数据结构之间的关系


AVFormatContext和AVInputFormat之间的关系

AVFormatContext API调用
  AVInputFormat 主要是FFMPEG内部调用
  数据
     AVFormatContext 封装格式上下文结构体
    struct AVInputFormat *iformat;
  方法
  AVInputFormat 每种封装格式(例如FLV, MKV, MP4)
  int (*read_header)(struct AVFormatContext * );
  int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);

AVCodecContext和AVCodec之间的关系

数据
  AVCodecContext 编码器上下文结构体
  struct AVCodec *codec;
方法
  AVCodec 每种视频(音频)编解码器
  int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
  int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr);

AVFormatContext、AVStream和AVCodecContext之间的关系


AVPacket和AVFrame之间的关系


解复用流程


相关函数简介

1、avformat_alloc_context(): 负责申请一个AVFormatContext结构的内存,并进行简单初始化。
  2、avformat_free_context(): 释放该结构里的所有东西以及该结构本身。
  3、avformat_close_input(): 关闭解复用器。关闭后就不再需要使用avformat_free_context 进行释放。
  4、avformat_open_input(): 打开输入视频文件。
  5、avformat_find_stream_info(): 获取音视频文件信息。
  6、av_read_frame(): 读取音视频包。
  7、avformat_seek_file(): 定位文件。
  8、av_seek_frame(): 定位文件。

解封装流程


ffmpeg 的 Mux 主要分为三步操作:
1、avformat_write_header: 写文件头
2、av_write_frame/av_interleaved_write_frame: 写packet
3、av_write_trailer: 写⽂件尾

编码流程


  1、avcodec_find_encoder: 根据指定的AVCodecID查找注册的编码器。
  2、avcodec_alloc_context3: 为AVCodecContext分配内存。
  3、avcodec_open2: 打开编码器。
  4、avcodec_send_frame: 将AVFrame⾮压缩数据给编码器。
  5、avcodec_receive_packet: 获取到编码后的AVPacket数据,收到的packet需要⾃⼰释放内存。
  6、av_frame_get_buffer: 为⾳频或视频帧分配新的buffer。在调⽤这个函数之前,必须在AVFame上设置好以下属性:format(视频为像素格式,⾳频为样本格式)、nb_samples(样本个数,针对⾳频)、channel_layout(通道类型,针对⾳频)、width/height(宽⾼,针对视频)。
  7、av_frame_make_writable: 确保AVFrame是可写的,使av_frame_make_writable()的问题是,在最坏的情况下,它会在您使⽤encode再次更改整个输⼊frame之前复制它. 如果frame不可写,av_frame_make_writable()将分配新的缓冲区,并复制这个输⼊input frame数据,避免和编码器需要缓存该帧时造成冲突。
  8、av_samples_fill_arrays: 填充⾳频帧。

解码流程


  1、avcodec_alloc_context3(): 分配解码器上下文 avcodec_find_decoder():根据ID查找解码器。
  2、avcodec_find_decoder_by_name(): 根据解码器名字 avcodec_open2(): 打开编解码器。
  3、avcodec_decode_video2(): 解码一帧视频数据。
  4、avcodec_decode_audio4(): 解码一帧音频数据。
  5、avcodec_send_packet(): 发送编码数据包 avcodec_receive_frame(): 接收解码后数据。
  6、avcodec_free_context(): 释放解码器上下文,包含了 avcodec_close()。
  7、avcodec_close(): 关闭解码器。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1012818
推荐阅读
相关标签
  

闽ICP备14008679号