FFMPEG推流器讲解

FFMPEG重要结构体的讲解

FFMPEG中有六个比较重要的结构体,分别是AVFormatContext、AVOutputFormat、 AVStream、AVCodec、AVCodecContext、AVPacket、AVFrame、AVIOContext结构体,这几个结构体是贯穿着整个FFMPEG核心功能。

AVFormatContext

这个结构体是统领全局的基本结构体,这个结构体最主要作用的是处理封装、解封装等核心功能。

 AVInputFormat * iformat:输入数据的封装格式,仅作用于解封装用avformat_open_input

AVOutputFormat * ofomat:输出数据的封装格式,仅作用于解封装用avformat_write_header

 AVIOContext * pb:I/O的上下文,在解封装中由用户在avformat_open_input之前来设置,若封装的时候用户在avformat_write_header之前设置

 int nb_streams:流的个数,若只有视频流nb_streams = 1, 若同时有视频流和音频流则nb_streams = 2。

AVStream **stream:列出文件中所有流的列表

 int64_t start_time:第一帧的位置

int64_t duration:流的持续时间

 int64_t bit_rate:流的比特率

 int64_t probsize:输入读取的用于确定容器格式的大小

 AVDictionary *metadata:元数据

AVCodec * video_codec:视频编解码器

AVCodec * audio_codec:音频编解码器

 AVCodec *subtitle_codec:字幕编解码器

AVCodec *data_codec:数据编解码器

AVOutputFormat 

这个结构体的功能类似于COM接口,表示文件容器输出格式,这个结构体的特点是着重于函数的实现

 

2.2.1 const char *name;  //描述的名称

2.2.2. const char *long_name;//格式的描述性名称,易于阅读。

2.2.3. enum AVCodecID audio_codec; //默认的音频编解码器

2.2.4. enum AVCodecID video_codec; //默认的视频编解码器

2.2.5. enum AVCodecID subtitle_codec; //默认的字幕编解码器

2.2.6. struct AVOutputFormat *next; //链表NEXT

2.2.7. int (*write_header)(struct AVFormatContext *);  //写入数据头部

2.2.8. int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);//写一个数据包。 如果在标志中设置AVFMT_ALLOW_FLUSH,则pkt可以为NULL。

2.2.9. int (*write_trailer)(struct AVFormatContext *); //写入数据尾部

2.2.10. int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, AVPacket *in, int flush); //刷新AVPacket,并写入

2.2.11. int (*control_message)(struct AVFormatContext *s, int type, void *data, size_t data_size);//允许从应用程序向设备发送消息。

2.2.12. int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,   AVFrame **frame, unsigned flags);//写一个未编码的AVFrame。

2.2.13. int (*init)(struct AVFormatContext *);//初始化格式。 可以在此处分配数据,并设置在发送数据包之前需要设置的任何AVFormatContext或AVStream参数。

2.2.14.void (*deinit)(struct AVFormatContext *);//取消初始化格式。

2.2.15. int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);//设置任何必要的比特流过滤,并提取全局头部所需的任何额外数据

AVStream

AVStream包含了每一个视频/音频流信息的结构体

2.3.1. index/id:这个数字是自动生成的,根据index可以从streams表中找到该流

2.3.2.time_base:流的时间基,这是一个实数,该AVStream中流媒体数据的PTS和DTS都将会以这个时间基准。视频时间基准以帧率为基准,音频以采样率为时间基准

2.3.3.start_time:流的起始时间,以流的时间基准为单位,通常是该流的第一个PTS

2.3.4.duration:流的总时间,以流的时间基准为单位

2.3.5.need_parsing:对该流的parsing过程的控制

2.3.6.nb_frames:流内的帧数目

2.3.7.avg_frame_rate:平均帧率

2.3.8.codec:该流对应的AVCodecContext结构,调用avformat_open_input生成

2.3.9.parser:指向该流对应的AVCodecParserContext结构,调用av_find_stream_info生成

AVCodec结构体

AVCodec是ffmpeg的音视频编解码,它提供了个钟音视频的编码库和解码库,FFMPEG通过AVCODEC可以将音视频数据编码成对应的数据压缩包。

2.4.1. AVCodecID:AVCODECID编码器的ID号,这里的编码器ID包含了视频的编码器ID,如:AV_CODEC_ID_H264、AV_CODEC_ID_H265等等。音频的编码器ID:AV_CODEC_ID_AAC、AV_CODEC_ID_MP3等等。

2.4.2. AVMediaType:指明当前编码器的类型,包括:视频(AVMEDIA_TYPE_VIDEO)、音频(AVMEDIA_TYPE_AUDIO)、字幕(AVMEDIA_TYPE_SUBTITILE)。

2.4.3. AVRotational supported_framerates:支持的帧率,这个参数仅支持视频设置

2.4.4. enum AVPixelFormat * pix_fmts:支持的像素格式,这个参数支持视频设置

2.4.5. int * supported_samplerates:支持的采样率,这个参数支持音频设置

2.4.6. enum AVSampleFormat * sample_fmts:支持的采样格式,这个参数仅支持音频设置

2.4.7. uint64_t * channel_layouts:支持的声道数,这个参数仅支持音频设置

2.4.8. int private_data_size:私有数据的大小

 

AVCodecContext

AVCodecContext是FFMPEG编解码上下文的结构体,它内部包含了AVCodec编解码参数结构体。除了AVCodec结构体外,还有AVCodecInternal、AVRotational结构体,这包含了AVCodecID、AVMediaType、AVPixelFormat、AVSampleFormat等类型,其中包含视频的分辨率width、height、帧率framerate、码率bitrate等。

 AVMediaType codec_type:指明当前编码器的类型,包括:视频(AVMEDIA_TYPE_VIDEO)、音频(AVMEDIA_TYPE_AUDIO)、字幕(AVMEDIA_TYPE_SUBTITILE)。

AVMediaType具体定义:

enum AVMediaType {

    AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA

    AVMEDIA_TYPE_VIDEO,

    AVMEDIA_TYPE_AUDIO,

    AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous

    AVMEDIA_TYPE_SUBTITLE,

    AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse

    AVMEDIA_TYPE_NB

};

2.5.2. AVMediaType codec_type:指明当前编码器的类型,包括:视频(AVMEDIA_TYPE_VIDEO)、音频(AVMEDIA_TYPE_AUDIO)、字幕(AVMEDIA_TYPE_SUBTITILE)。

2.5.3. AVCodec * codec:指明相应的编解码器,如H264/H265等等

2.5.4. AVCodecID * codec_id:编解码器的ID,这个在上面有详细的说明

2.5.5. void * priv_data:指向相对应的编解码器

2.5.6. int bit_rate:编码的码流,这里包含了音频码流和视频码流码率的设置

2.5.7.thread_count:编解码时候线程的数量,这个由用户自己设置和CPU数量有关

2.5.8. AVRational time_base:根据该参数可以将pts转换为时间

2.5.9. int width, height:每一帧的宽和高

2.5.10. AVRational time_base:根据该参数可以将pts转换为时间

2.5.11. int gop_size:一组图片的数量,专门用于视频编码

2.5.12.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值