美文网首页
FFmpeg结构体:AVOutputFormat

FFmpeg结构体:AVOutputFormat

作者: YellowLayne | 来源:发表于2017-03-15 11:04 被阅读0次

    1.描述

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

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

    2.结构体定义

    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;
    

    3.常见变量及其作用

    const char *name;
    const char *long_name;//格式的描述性名称,易于阅读。
    enum AVCodecID audio_codec; //默认的音频编解码器
    enum AVCodecID video_codec; //默认的视频编解码器
    enum AVCodecID subtitle_codec; //默认的字幕编解码器
    struct AVOutputFormat *next;
    int (*write_header)(struct AVFormatContext *);
    int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);//写一个数据包。 如果在标志中设置AVFMT_ALLOW_FLUSH,则pkt可以为NULL。
    int (*write_trailer)(struct AVFormatContext *);
    int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, AVPacket *in, int flush);
    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);//写一个未编码的AVFrame。
    int (*init)(struct AVFormatContext *);//初始化格式。 可以在此处分配数据,并设置在发送数据包之前需要设置的任何AVFormatContext或AVStream参数。
    void (*deinit)(struct AVFormatContext *);//取消初始化格式。
    int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);//设置任何必要的比特流过滤,并提取全局头部所需的任何额外数据。
    

    相关文章

      网友评论

          本文标题:FFmpeg结构体:AVOutputFormat

          本文链接:https://www.haomeiwen.com/subject/bpqlnttx.html