ffmpeg数据结构简介

2020年11月23日 351点热度 0人点赞 0条评论

每个库的功能作用

在 FFmpeg 的编译中可以编译出了6个so动态库:

libavcodec.so
libavfilter.so
libavformat.so
libavutil.so
libswresample.so
libswscale.so

那么每个so库的作用是什么呢,都包含什么功能呢?

libavcodec.so  是一个包含音频/视频编解码器解码器和编码器的库。
libavfilter.so 是一个包含媒体过滤器的库
libavformat.so 是一个包含用于多媒体容器格式的解复用器和封装复用器的库。
libavutil.so  是一个包含简化编程功能的库,包括随机数生成器,数据结构,数学例程,核心多媒体实用程序等等。
libswresample.so 是一个用于执行高度优化的音频重采样,重新矩阵化和采样格式转换操作的库
libswscale.so  是一个执行高度优化的图像缩放和色彩空间/像素格式转换操作的库。

常见的数据结构

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

  • iformat:输入视频的AVInputFormat

  • nb_streams :输入视频的AVStream 个数

  • streams :输入视频的AVStream []数组

  • duration :输入视频的时长(以微秒为单位)

  • bit_rate :输入视频的码率

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

  • name:封装格式名称

  • long_name:封装格式的长名称

  • extensions:封装格式的扩展名

  • id:封装格式ID

  • 一些封装格式处理的接口函数

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

  • id:序号

  • codec:该流对应的AVCodecContext

  • time_base:该流的时基

  • r_frame_rate:该流的帧率

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

  • codec:编解码器的AVCodec

  • width, height:图像的宽高(只针对视频)

  • pix_fmt:像素格式(只针对视频)

  • sample_rate:采样率(只针对音频)

  • channels:声道数(只针对音频)

  • sample_fmt:采样格式(只针对音频)

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

  • name:编解码器名称

  • long_name:编解码器长名称

  • type:编解码器类型

  • id:编解码器ID

  • 一些编解码的接口函数

5、 AVPacket 存储一帧压缩编码数据。

  • pts:显示时间戳

  • dts :解码时间戳

  • data :压缩编码数据

  • size :压缩编码数据大小

  • stream_index :所属的AVStream

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

  • data:解码后的图像像素数据(音频采样数据)。

  • linesize:对视频来说是图像中一行像素的大小;对音频来说是音频帧的大小。

  • width, height:图像的宽高(只针对视频)。

  • key_frame:是否为关键帧(只针对视频) 。

  • pict_type:帧类型(只针对视频) 。例如I,P,B。

常用的函数

1、libavformat

  • int     avformat_network_init (void)
    初始化网络,直播推流、拉流或者播放在线资源会用到。

  • AVFormatContext *     avformat_alloc_context (void)
    初始化AVFormatContext结构体,解复用或者打开多媒体资源的时候用到。

  • void     avformat_free_context (AVFormatContext *s)
    使用AVFormatContext,一般情况在调用了一个带有alloc的函数,都会有一个带有free的函数相对应。

  • int     avformat_open_input (AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)
    打开多媒体资源

  • int     av_find_best_stream (AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags)
    查找特定类型的流索引。比如视频索引、音频索引等。

  • int     av_read_frame (AVFormatContext *s, AVPacket *pkt)
    读取流中的下一帧数据

  • void     avformat_close_input (AVFormatContext **s)
    关闭一个AVFormatContext,一般使用了一个带有open字段的函数,也会有一个对应的带有close的函数。

2、libavcodec

  • avcodec_register_all (void)
    注册所有编码器也可以使用avcodec_register (AVCodec *codec)注册单个编码器。

  • AVCodecContext *     avcodec_alloc_context3 (const AVCodec *codec)
    初始化分配解码器

  • void     avcodec_free_context (AVCodecContext **avctx)
    释放解码器

  • int     avcodec_open2 (AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
    打开解码器

  • int     avcodec_close (AVCodecContext *avctx)
    关闭解码器

  • AVCodec *     avcodec_find_decoder (enum AVCodecID id)
    根据id查找解码器

  • AVCodec *     avcodec_find_decoder_by_name (const char *name)
    根据名字查找解码器

结语

今天的内容比较空洞,都是些api的简单解说,有点空中阁楼的感觉。ffmpeg是一个功能强大的库,所以要学好它也不是一时半刻的事情,我们要先能学会用ffpemg做一些简单的编解码工作,大概理解了它的一些规律之后再在这个基础上做一些炫酷的功能。
ffmpeg API官方参考文档https://ffmpeg.org/doxygen/4.1/index.html

最后如果你对音视频开发感兴趣可扫码关注,后续我们共同探讨,共同进步。

图片

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

图片

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

NDK 学习进阶免费视频来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

图片

82550ffmpeg数据结构简介

这个人很懒,什么都没留下

文章评论