ffmpeg入门--结构体和类库

入门推荐大神资料:

1. jerrywu145:ffmpeg小白10day
2. 雷神博客视频
3.ffmpeg编程基础和一些常见问题的解答
4. ffmpeg专栏

bin文件中可以看到8个库:

在这里插入图片描述

一、FFmpeg的8个库

  1. avdevice : 硬件的音视频采集、加速和显示。
  2. avfilter:滤镜特效处理。
  3. avformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息、读取音视频数据等功能。各种流媒体协议代码(如rtmpproto.c等)以及音视频格式的(解)复用代码(如flvdec.c、flvenc.c等)都位于该目录下
  4. avcodec:编解码,音视频各种格式的编解码。各种格式的编解码代码(如aacenc.c、aacdec.c等)都位于该目录下。
  5. postproc: 用于后期效果处理,如图像的去块效应等。
  6. swresample:音频采样数据格式转换,提供音频重采样,采样格式转换和混合等功能。
  7. swscale:提供原始视频的比例缩放、色彩映射转换、图像颜色空间或格式转换的功能。
  8. avutil:包含一些公共的工具函数的使用库,包括算数运算,字符操作等。

二、FFmpeg的常用数据结构

1. 封装格式

  • AVFormatContext
    描述媒体文件的构成及基本信息,封装格式上下文结构体,是统领全局的基本结构体,很多函数需要使用它作为参数,保存了视频文件封装格式相关信息。

    AVFormatContext是FFMpeg格式转换过程中实现输入和输出功能、保存相关数据的主要结构。每一个输入和输出文件,都在如下定义的指针数组全局变量中有对应的实体。

    static AVFormatContext *output_files[MAX_FILES];
    static AVFormatContext *input_files[MAX_FILES];
    

    对于输入和输出,因为共用的是同一个结构体,所以需要分别对该结构中如下定义的iformat或oformat成员赋值。

    struct AVInputFormat *iformat;
    struct AVOutputFormat *oformat;
    

    对一个AVFormatContext来说,二个成员不能同时有值,即一个AVFormatContext不能同时含有demuxer和muxer。

    主要变量

    struct AVInputFormat *iformat:输入数据的封装格式
    AVIOContext *pb:输入数据缓存
    unsigned int nb_streams:音视频流个数(输入视频的AVStream 个数)
    AVStream **streams:音视频流(输入视频的AVStream []数组)
    char filename[1024]:文件名
    int64_t duration:时长(单位:us)(输入视频的时长(以微秒为单位))
    int bit_rate:比特率(输入视频的码率)
    AVDictionary *metadata:元数据

  • AVInputFormat / AVOutputFormat
    解复用器对象,每种作为输入的封装格式对应一个该结构体。
    复用器对象,每种作为输出的封装格式对应一个该结构体。

    根据输入和输出流的不同,AVStream结构都是封装在AVInputStream和 AVOutputStream结构中,在av_encode( )函数中使用。

    AVInputStream中还保存的有与时间有关的信息。
    AVOutputStream中还保存有与音视频同步等相关的信息。

    主要变量

    long_name:封装格式的长名称
    extensions:封装格式的扩展名
    id:封装格式ID
    一些封装格式处理的接口函数

  • AVStream
    用于描述一个视频或者音频流的相关数据信息,视频文件中每个视频(音频)流对应一个该结构体。

    AVStream结构保存与数据流相关的编解码器,数据段等信息。比较重要的有如下二个成员:

    AVCodecContext *codec; /**< codec context */
    void *priv_data;
    
    其中codec指针保存的是encoder或decoder结构。
    
    priv_data指针保存的是和具体编解码流相关的数据,
    在ASF的解码过程中,priv_data保存的就是ASFStream结构的数据。
    
    主要变量

    AVCodecContext codec:视频/音频流的AVCodecContext
    AVRational time_base:时间基准,真正的时间 =PTS
    time_base
    int64_t duration:该视频/音频流时间长度
    AVDictionary *metadata:元数据信息
    AVRational avg_frame_rate:帧率
    AVPacket attached_pic:附加图片

2. 编解码

  • AVCodecContext
    描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息。

    保存AVCodec指针和与codec相关的数据,如video的width、height,audio的sample rate等。AVCodecContext中的codec_type,codec_id二个变量对于encoder/decoder的匹配来说,最为重要。

    enum CodecType codec_type; /* see CODEC_TYPE_xxx */
    enum CodecID codec_id; /* see CODEC_ID_xxx */
    如上所示,codec_type保存的是CODEC_TYPE_VIDEO,CODEC_TYPE_AUDIO等媒体类型,
    codec_id保存的是CODEC_ID_FLV1,CODEC_ID_VP6F等编码方式。
    

    以支持flv格式为例,在前述的av_open_input_file(…… ) 函数中,匹配到正确的AVInputFormatdemuxer后,通过av_open_input_stream( )函数中调用AVInputFormat的read_header接口来执行flvdec.c中的flv_read_header( )函数。在flv_read_header( )函数内,根据文件头中的数据,创建相应的视频或音频AVStream,并设置AVStream中AVCodecContext的正确的codec_type值。codec_id值是在解码过程中flv_read_packet( )函数执行时根据每一个packet头中的数据来设置的。

    主要变量

    codec:编解码器的AVCodec
    width, height:图像的宽高(只针对视频)
    pix_fmt:像素格式(只针对视频)
    sample_rate:采样率(只针对音频)
    channels:声道数(只针对音频)
    sample_fmt:采样格式(只针对音频)

  • AVCodec
    编解码器对象,每种编解码格式对应一个该结构体,每一个AVCodecContext都包含一个AVCodec;

    主要变量

    name:编解码器名称
    long_name:编解码器长名称
    type:编解码器类型
    id:编解码器ID
    一些编解码的接口函数

  • AVCodecParameters
    编解码参数,每个AVStream中都含有一个AVcodecParameters,用于存放当前流的编解码参数。

    主要变量

    enum AVMediaType codec_type 编码数据的一般类型;
    enum AVCodecID codec_id 特定类型的编码数据(使用的编解码器);
    uint32_t codec_tag 有关编解码器的其他信息;
    uint8_t *extradata 初始化解码器所需的额外二进制数据,依赖于编解码器;
    int extradata_size extradata内容的大小(以字节为单位);
    int64_t bit_rate 编码数据的平均比特率(以每秒位数为单位)

3. 网络协议

  • AVIOContext
    管理输入输出的结构体。字节IO 上下文。

    主要变量

    unsigned char * buffer 启动缓冲区
    int buffer_size 最大缓冲区大小
    unsigned char * buf_ptr 缓冲区当前位置
    unsigned char * buf_end 如果读取函数返回的数据少于请求数据,则数据结束可能小于buffer + buffer_size

  • URLProtocol
    描述音视频数据传输所使用的协议,每种传输协议对应一个URLContext结构。

    主要变量

  • AVPacket
    用于保存读取的packet数据。存储一帧压缩编码数据。存放编码后,解码前的压缩数据,即ES数据。

    主要变量

    uint8_t *data:压缩编码数据,一个AVPacket的data通常对应一个NAL。
    int size:data的大小
    int64_t pts:显示时间戳
    int64_t dts:解码时间戳
    int stream_index:标识该AVPacket所属的视频/音频流。

  • AVFrame
    该结构描述了解码的(原始)音频或视频数据。存放编码前,解码后的原始数据,如YUV格式的视频数据或PCM|格式的音频数据等.

    主要变量

    data:解码后的图像像素数据(音频采样数据)。
    linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小。
    width, height:图像的宽高(只针对视频)。
    key_frame:是否为关键帧(只针对视频) 。
    pict_type:帧类型(只针对视频) 。例如I,P,B。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值