FFmpeg結構體:AVOutputFormat

粒子少爷發表於2024-06-11

1.描述

AVOutpufFormat與AVInputFormat類似,是類似COM 介面的資料結構,表示輸出檔案容器格式,著重於功能函式,位於Avoformat.h檔案中。
ffmpeg支援各種各樣的輸出檔案格式,MP4,FLV,3GP等等。而 AVOutputFormat 結構體則儲存了這些格式的資訊和一些常規設定。

每一種封裝對應一個 AVOutputFormat 結構,ffmpeg將AVOutputFormat 按照連結串列儲存:

2.結構體定義

  1 typedef struct AVOutputFormat {
  2     const char *name;
  3     /**
  4      * Descriptive name for the format, meant to be more human-readable
  5      * than name. You should use the NULL_IF_CONFIG_SMALL() macro
  6      * to define it.
  7      */
  8     const char *long_name;
  9     const char *mime_type;
 10     const char *extensions; /**< comma-separated filename extensions */
 11     /* output support */
 12     enum AVCodecID audio_codec;    /**< default audio codec */
 13     enum AVCodecID video_codec;    /**< default video codec */
 14     enum AVCodecID subtitle_codec; /**< default subtitle codec */
 15     /**
 16      * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER,
 17      * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
 18      * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH,
 19      * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE
 20      */
 21     int flags;
 22 
 23     /**
 24      * List of supported codec_id-codec_tag pairs, ordered by "better
 25      * choice first". The arrays are all terminated by AV_CODEC_ID_NONE.
 26      */
 27     const struct AVCodecTag * const *codec_tag;
 28 
 29 
 30     const AVClass *priv_class; ///< AVClass for the private context
 31 
 32     /*****************************************************************
 33      * No fields below this line are part of the public API. They
 34      * may not be used outside of libavformat and can be changed and
 35      * removed at will.
 36      * New public fields should be added right above.
 37      *****************************************************************
 38      */
 39     struct AVOutputFormat *next;
 40     /**
 41      * size of private data so that it can be allocated in the wrapper
 42      */
 43     int priv_data_size;
 44 
 45     int (*write_header)(struct AVFormatContext *);
 46     /**
 47      * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,
 48      * pkt can be NULL in order to flush data buffered in the muxer.
 49      * When flushing, return 0 if there still is more data to flush,
 50      * or 1 if everything was flushed and there is no more buffered
 51      * data.
 52      */
 53     int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
 54     int (*write_trailer)(struct AVFormatContext *);
 55     /**
 56      * Currently only used to set pixel format if not YUV420P.
 57      */
 58     int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
 59                              AVPacket *in, int flush);
 60     /**
 61      * Test if the given codec can be stored in this container.
 62      *
 63      * @return 1 if the codec is supported, 0 if it is not.
 64      *         A negative number if unknown.
 65      *         MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC
 66      */
 67     int (*query_codec)(enum AVCodecID id, int std_compliance);
 68 
 69     void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
 70                                  int64_t *dts, int64_t *wall);
 71     /**
 72      * Allows sending messages from application to device.
 73      */
 74     int (*control_message)(struct AVFormatContext *s, int type,
 75                            void *data, size_t data_size);
 76 
 77     /**
 78      * Write an uncoded AVFrame.
 79      *
 80      * See av_write_uncoded_frame() for details.
 81      *
 82      * The library will free *frame afterwards, but the muxer can prevent it
 83      * by setting the pointer to NULL.
 84      */
 85     int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,
 86                                AVFrame **frame, unsigned flags);
 87     /**
 88      * Returns device list with it properties.
 89      * @see avdevice_list_devices() for more details.
 90      */
 91     int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
 92     /**
 93      * Initialize device capabilities submodule.
 94      * @see avdevice_capabilities_create() for more details.
 95      */
 96     int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
 97     /**
 98      * Free device capabilities submodule.
 99      * @see avdevice_capabilities_free() for more details.
100      */
101     int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
102     enum AVCodecID data_codec; /**< default data codec */
103     /**
104      * Initialize format. May allocate data here, and set any AVFormatContext or
105      * AVStream parameters that need to be set before packets are sent.
106      * This method must not write output.
107      *
108      * Any allocations made here must be freed in deinit().
109      */
110     int (*init)(struct AVFormatContext *);
111     /**
112      * Deinitialize format. If present, this is called whenever the muxer is being
113      * destroyed, regardless of whether or not the header has been written.
114      *
115      * If a trailer is being written, this is called after write_trailer().
116      *
117      * This is called if init() fails as well.
118      */
119     void (*deinit)(struct AVFormatContext *);
120     /**
121      * Set up any necessary bitstream filtering and extract any extra data needed
122      * for the global header.
123      * Return 0 if more packets from this stream must be checked; 1 if not.
124      */
125     int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);
126 } AVOutputFormat;

3.常見變數及其作用


 1 const char *name;
 2 const char *long_name;//格式的描述性名稱,易於閱讀。
 3 enum AVCodecID audio_codec; //預設的音訊編解碼器
 4 enum AVCodecID video_codec; //預設的影片編解碼器
 5 enum AVCodecID subtitle_codec; //預設的字幕編解碼器
 6 struct AVOutputFormat *next;
 7 int (*write_header)(struct AVFormatContext *);
 8 int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);//寫一個資料包。 如果在標誌中設定AVFMT_ALLOW_FLUSH,則pkt可以為NULL。
 9 int (*write_trailer)(struct AVFormatContext *);
10 int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, AVPacket *in, int flush);
11 int (*control_message)(struct AVFormatContext *s, int type, void *data, size_t data_size);//允許從應用程式向裝置傳送訊息。
12 int (*write_uncoded_frame)(struct AVFormatContext *, int stream_index,   AVFrame **frame, unsigned flags);//寫一個未編碼的AVFrame。
13 int (*init)(struct AVFormatContext *);//初始化格式。 可以在此處分配資料,並設定在傳送資料包之前需要設定的任何AVFormatContext或AVStream引數。
14 void (*deinit)(struct AVFormatContext *);//取消初始化格式。
15 int (*check_bitstream)(struct AVFormatContext *, const AVPacket *pkt);//設定任何必要的位元流過濾,並提取全域性頭部所需的任何額外資料。


作者:YellowLayne
連結:https://www.jianshu.com/p/4d1629aaba42
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章