ffmpeg——AVOutputFormat 输出文件格式

来源:互联网 发布:中学生学编程用什么书 编辑:程序博客网 时间:2024/05/14 14:26

一:介绍

ffmpeg支持各种各样的输出文件格式,MP4,FLV,3GP等等。而 AVOutputFormat 结构体则保存了这些格式的信息和一些常规设置。

官方参考: http://ffmpeg.org/doxygen/3.1/structAVOutputFormat.html

typedef struct AVOutputFormat {    const char *name;    /**     * Descriptive name for the format, meant to be more human-readable     * than name. You should use the NULL_IF_CONFIG_SMALL() macro     * to define it.     */    const char *long_name;    const char *mime_type;    const char *extensions; /**< comma-separated filename extensions */    /* output support */    enum AVCodecID audio_codec;    /**< default audio codec */    enum AVCodecID video_codec;    /**< default video codec */    enum AVCodecID subtitle_codec; /**< default subtitle codec */    /**     * can use 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;    /**     * List of supported codec_id-codec_tag pairs, ordered by "better     * choice first". The arrays are all terminated by AV_CODEC_ID_NONE.     */    const struct AVCodecTag * const *codec_tag;    const AVClass *priv_class; ///< AVClass for the private context    /*****************************************************************     * No fields below this line are part of the public API. They     * may not be used outside of libavformat and can be changed and     * removed at will.     * New public fields should be added right above.     *****************************************************************     */    struct AVOutputFormat *next;    /**     * size of private data so that it can be allocated in the wrapper     */    int priv_data_size;    int (*write_header)(struct AVFormatContext *);    /**     * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,     * pkt can be NULL in order to flush data buffered in the muxer.     * When flushing, return 0 if there still is more data to flush,     * or 1 if everything was flushed and there is no more buffered     * data.     */    int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);    int (*write_trailer)(struct AVFormatContext *);    /**     * Currently only used to set pixel format if not YUV420P.     */    int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,                             AVPacket *in, int flush);    /**     * Test if the given codec can be stored in this container.     *     * @return 1 if the codec is supported, 0 if it is not.     *         A negative number if unknown.     *         MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC     */    int (*query_codec)(enum AVCodecID id, int std_compliance);    void (*get_output_timestamp)(struct AVFormatContext *s, int stream,                                 int64_t *dts, int64_t *wall);    /**     * Allows sending messages from application to device.     */    int (*control_message)(struct AVFormatContext *s, int type,                           void *data, size_t data_size);    /**     * Write an uncoded AVFrame.     *     * See av_write_uncoded_frame() for details.     *     * The library will free *frame afterwards, but the muxer can prevent it     * by setting the pointer to NULL.     */    int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,                               AVFrame **frame, unsigned flags);    /**     * Returns device list with it properties.     * @see avdevice_list_devices() for more details.     */    int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);    /**     * Initialize device capabilities submodule.     * @see avdevice_capabilities_create() for more details.     */    int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);    /**     * Free device capabilities submodule.     * @see avdevice_capabilities_free() for more details.     */    int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);    enum AVCodecID data_codec; /**< default data codec */    /**     * Initialize format. May allocate data here, and set any AVFormatContext or     * AVStream parameters that need to be set before packets are sent.     * This method must not write output.     *     * Any allocations made here must be freed in deinit().     */    int (*init)(struct AVFormatContext *);    /**     * Deinitialize format. If present, this is called whenever the muxer is being     * destroyed, regardless of whether or not the header has been written.     *     * If a trailer is being written, this is called after write_trailer().     *     * This is called if init() fails as well.     */    void (*deinit)(struct AVFormatContext *);    /**     * Set up any necessary bitstream filtering and extract any extra data needed     * for the global header.     * Return 0 if more packets from this stream must be checked; 1 if not.     */    int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);} AVOutputFormat;
AVOutputFormat 结构主要包含的信息有:封装名称描述编码格式信息(video/audio 默认编码格式,支持的编码格式列表)一些对封装的操作函数(write_header,write_packet,write_tailer等)。其中,AVOutputFormat没有实现AVClass接口,但它保存了一个AVClass接口,具体怎样被使用则由后续决定。例如:MOV类的AVOutputFormat封装保存的是 针对 MOVMuxContext 结构的 AVClass 接口实现。


每一种封装对应一个 AVOutputFormat 结构,ffmpeg将AVOutputFormat 按照链表存储:





0 0