FFmpeg结构体-AVOutputFormat

2018-12-27  本文已影响0人  张俊峰0613

AVOutputFormat

AVOutpufFormat与AVInputFormat类似,是类似COM 接口的数据结构,表示输出文件容器格式,着重于功能函数,位于Avoformat.h文件中。
ffmpeg支持各种各样的输出文件格式,MP4,FLV,3GP等等。而 AVOutputFormat 结构体则保存了这些格式的信息和一些常规设置
每一种封装对应一个 AVOutputFormat 结构,ffmpeg将AVOutputFormat 按照链表存储:

typedef struct AVOutputFormat {
    const char *name;  //格式名列表,简短的名称,用于通过此名称来找到此muxer解封装器
    const char *long_name; //长名称,用于仔细描述此muxer解封装器
    const char *mime_type; //一个模拟类型列表,在probe时check匹配的类型
    const char *extensions; //如果定义了extensions就不会再检测格式名,通常不定义
    enum AVCodecID audio_codec;    //音频编解码器ID
    enum AVCodecID video_codec;    //视频编解码器ID
    enum AVCodecID subtitle_codec; //subtitle编解码器ID
    /**
     * 可用标志 flags: AVFMT_NOFILE,  AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER,  AVFMT_NOTIMESTAMPS,  AVFMT_VARIABLE_FPS,
     *        AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH, AVFMT_TS_NONSTRICT,  AVFMT_TS_NEGATIVE
     */
    int flags;
    const struct AVCodecTag * const *codec_tag;
    const AVClass *priv_class; //AVClass结构
    struct AVOutputFormat *next; //链表
    int priv_data_size; //具体文件容器格式所对应的Context的大小,通俗讲就是私有结构体的大小


    //muxer开放的接口
    int (*write_header)(struct AVFormatContext *);
    int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
    int (*write_trailer)(struct AVFormatContext *);
    int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,AVPacket *in, int flush);
    int (*query_codec)(enum AVCodecID id, int std_compliance);
    void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
    int (*control_message)(struct AVFormatContext *s, int type, void *data, size_t data_size);
    int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index, AVFrame **frame, unsigned flags);
    int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
    int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
    int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
    enum AVCodecID data_codec; //默认的编解码ID
    int (*init)(struct AVFormatContext *);
    void (*deinit)(struct AVFormatContext *);
    int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);
} AVOutputFormat;
上一篇下一篇

猜你喜欢

热点阅读