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
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。