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; |