• AVInputFormat AVOutputFormat


    AVInputFormat

    1. AVInputFormat是demuxer或者indev

        AVInputFormat *previn = NULL, *in; 
        for (int i = 0; (in = (AVInputFormat*)demuxer_list[i]); i++) {
            if (previn)
                previn->next = in;
            previn = in;
        }
    
        if (indev_list) {
            for (int i = 0; (in = (AVInputFormat*)indev_list[i]); i++) {
                if (previn)
                    previn->next = in;
                previn = in;
            }
        }
    

    2. AVInputFormat的声明

    typedef struct AVInputFormat {
        /**
         * A comma separated list of short names for the format. New names
         * may be appended with a minor bump.
         */
        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;
    
        /**
         * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
         * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
         * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
         */
        int flags;
    
        /**
         * If extensions are defined, then no probe is done. You should
         * usually not use extension format guessing because it is not
         * reliable enough
         */
        const char *extensions;
    
        const struct AVCodecTag * const *codec_tag;
    
        const AVClass *priv_class; ///< AVClass for the private context
    
        /**
         * Comma-separated list of mime types.
         * It is used check for matching mime types while probing.
         * @see av_probe_input_format2
         */
        const char *mime_type;
    
        /*****************************************************************
         * 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.
         *****************************************************************
         */
        ff_const59 struct AVInputFormat *next;
    
        /**
         * Raw demuxers store their codec ID here.
         */
        int raw_codec_id;
    
        /**
         * Size of private data so that it can be allocated in the wrapper.
         */
        int priv_data_size;
    
        /**
         * Tell if a given file has a chance of being parsed as this format.
         * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
         * big so you do not have to check for that unless you need more.
         */
        int (*read_probe)(const AVProbeData *);
    
        /**
         * Read the format header and initialize the AVFormatContext
         * structure. Return 0 if OK. 'avformat_new_stream' should be
         * called to create new streams.
         */
        int (*read_header)(struct AVFormatContext *);
    
        /**
         * Read one packet and put it in 'pkt'. pts and flags are also
         * set. 'avformat_new_stream' can be called only if the flag
         * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a
         * background thread).
         * @return 0 on success, < 0 on error.
         *         When returning an error, pkt must not have been allocated
         *         or must be freed before returning
         */
        int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
    
        /**
         * Close the stream. The AVFormatContext and AVStreams are not
         * freed by this function
         */
        int (*read_close)(struct AVFormatContext *);
    
        /**
         * Seek to a given timestamp relative to the frames in
         * stream component stream_index.
         * @param stream_index Must not be -1.
         * @param flags Selects which direction should be preferred if no exact
         *              match is available.
         * @return >= 0 on success (but not necessarily the new offset)
         */
        int (*read_seek)(struct AVFormatContext *,
                         int stream_index, int64_t timestamp, int flags);
    
        /**
         * Get the next timestamp in stream[stream_index].time_base units.
         * @return the timestamp or AV_NOPTS_VALUE if an error occurred
         */
        int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                                  int64_t *pos, int64_t pos_limit);
    
        /**
         * Start/resume playing - only meaningful if using a network-based format
         * (RTSP).
         */
        int (*read_play)(struct AVFormatContext *);
    
        /**
         * Pause playing - only meaningful if using a network-based format
         * (RTSP).
         */
        int (*read_pause)(struct AVFormatContext *);
    
        /**
         * Seek to timestamp ts.
         * Seeking will be done so that the point from which all active streams
         * can be presented successfully will be closest to ts and within min/max_ts.
         * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
         */
        int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int 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);
    } AVInputFormat;
    
    
    
    

    3. demuxer_list的定义位于libavformat/demuxer_list.c

    static const AVInputFormat * const demuxer_list[] = {
        &ff_aa_demuxer,
        &ff_aac_demuxer,
        &ff_ac3_demuxer,
        &ff_acm_demuxer,
        &ff_act_demuxer,
        &ff_adf_demuxer,
        &ff_adp_demuxer,
        &ff_ads_demuxer,
        &ff_adx_demuxer,
        &ff_aea_demuxer,
        &ff_afc_demuxer,
        &ff_aiff_demuxer,
        &ff_aix_demuxer,
        &ff_amr_demuxer,
        &ff_amrnb_demuxer,
        &ff_amrwb_demuxer,
        &ff_anm_demuxer,
        &ff_apc_demuxer,
        &ff_ape_demuxer,
        &ff_apng_demuxer,
        &ff_aptx_demuxer,
        &ff_aptx_hd_demuxer,
        &ff_aqtitle_demuxer,
        &ff_asf_demuxer,
        &ff_asf_o_demuxer,
        &ff_ass_demuxer,
        &ff_ast_demuxer,
        &ff_au_demuxer,
        &ff_avi_demuxer,
        &ff_avr_demuxer,
        &ff_avs_demuxer,
        &ff_avs2_demuxer,
        &ff_bethsoftvid_demuxer,
        &ff_bfi_demuxer,
        &ff_bintext_demuxer,
        &ff_bink_demuxer,
        &ff_bit_demuxer,
        &ff_bmv_demuxer,
        &ff_bfstm_demuxer,
        &ff_brstm_demuxer,
        &ff_boa_demuxer,
        &ff_c93_demuxer,
        &ff_caf_demuxer,
        &ff_cavsvideo_demuxer,
        &ff_cdg_demuxer,
        &ff_cdxl_demuxer,
        &ff_cine_demuxer,
        &ff_codec2_demuxer,
        &ff_codec2raw_demuxer,
        &ff_concat_demuxer,
        &ff_data_demuxer,
        &ff_daud_demuxer,
        &ff_dcstr_demuxer,
        &ff_dfa_demuxer,
        &ff_dhav_demuxer,
        &ff_dirac_demuxer,
        &ff_dnxhd_demuxer,
        &ff_dsf_demuxer,
        &ff_dsicin_demuxer,
        &ff_dss_demuxer,
        &ff_dts_demuxer,
        &ff_dtshd_demuxer,
        &ff_dv_demuxer,
        &ff_dvbsub_demuxer,
        &ff_dvbtxt_demuxer,
        &ff_dxa_demuxer,
        &ff_ea_demuxer,
        &ff_ea_cdata_demuxer,
        &ff_eac3_demuxer,
        &ff_epaf_demuxer,
        &ff_ffmetadata_demuxer,
        &ff_filmstrip_demuxer,
        &ff_fits_demuxer,
        &ff_flac_demuxer,
        &ff_flic_demuxer,
        &ff_flv_demuxer,
        &ff_live_flv_demuxer,
        &ff_fourxm_demuxer,
        &ff_frm_demuxer,
        &ff_fsb_demuxer,
        &ff_g722_demuxer,
        &ff_g723_1_demuxer,
        &ff_g726_demuxer,
        &ff_g726le_demuxer,
        &ff_g729_demuxer,
        &ff_gdv_demuxer,
        &ff_genh_demuxer,
        &ff_gif_demuxer,
        &ff_gsm_demuxer,
        &ff_gxf_demuxer,
        &ff_h261_demuxer,
        &ff_h263_demuxer,
        &ff_h264_demuxer,
        &ff_hcom_demuxer,
        &ff_hevc_demuxer,
        &ff_hls_demuxer,
        &ff_hnm_demuxer,
        &ff_ico_demuxer,
        &ff_idcin_demuxer,
        &ff_idf_demuxer,
        &ff_iff_demuxer,
        &ff_ifv_demuxer,
        &ff_ilbc_demuxer,
        &ff_image2_demuxer,
        &ff_image2pipe_demuxer,
        &ff_image2_alias_pix_demuxer,
        &ff_image2_brender_pix_demuxer,
        &ff_ingenient_demuxer,
        &ff_ipmovie_demuxer,
        &ff_ircam_demuxer,
        &ff_iss_demuxer,
        &ff_iv8_demuxer,
        &ff_ivf_demuxer,
        &ff_ivr_demuxer,
        &ff_jacosub_demuxer,
        &ff_jv_demuxer,
        &ff_kux_demuxer,
        &ff_lmlm4_demuxer,
        &ff_loas_demuxer,
        &ff_lrc_demuxer,
        &ff_lvf_demuxer,
        &ff_lxf_demuxer,
        &ff_m4v_demuxer,
        &ff_matroska_demuxer,
        &ff_mgsts_demuxer,
        &ff_microdvd_demuxer,
        &ff_mjpeg_demuxer,
        &ff_mjpeg_2000_demuxer,
        &ff_mlp_demuxer,
        &ff_mlv_demuxer,
        &ff_mm_demuxer,
        &ff_mmf_demuxer,
        &ff_mov_demuxer,
        &ff_mp3_demuxer,
        &ff_mpc_demuxer,
        &ff_mpc8_demuxer,
        &ff_mpegps_demuxer,
        &ff_mpegts_demuxer,
        &ff_mpegtsraw_demuxer,
        &ff_mpegvideo_demuxer,
        &ff_mpjpeg_demuxer,
        &ff_mpl2_demuxer,
        &ff_mpsub_demuxer,
        &ff_msf_demuxer,
        &ff_msnwc_tcp_demuxer,
        &ff_mtaf_demuxer,
        &ff_mtv_demuxer,
        &ff_musx_demuxer,
        &ff_mv_demuxer,
        &ff_mvi_demuxer,
        &ff_mxf_demuxer,
        &ff_mxg_demuxer,
        &ff_nc_demuxer,
        &ff_nistsphere_demuxer,
        &ff_nsp_demuxer,
        &ff_nsv_demuxer,
        &ff_nut_demuxer,
        &ff_nuv_demuxer,
        &ff_ogg_demuxer,
        &ff_oma_demuxer,
        &ff_paf_demuxer,
        &ff_pcm_alaw_demuxer,
        &ff_pcm_mulaw_demuxer,
        &ff_pcm_vidc_demuxer,
        &ff_pcm_f64be_demuxer,
        &ff_pcm_f64le_demuxer,
        &ff_pcm_f32be_demuxer,
        &ff_pcm_f32le_demuxer,
        &ff_pcm_s32be_demuxer,
        &ff_pcm_s32le_demuxer,
        &ff_pcm_s24be_demuxer,
        &ff_pcm_s24le_demuxer,
        &ff_pcm_s16be_demuxer,
        &ff_pcm_s16le_demuxer,
        &ff_pcm_s8_demuxer,
        &ff_pcm_u32be_demuxer,
        &ff_pcm_u32le_demuxer,
        &ff_pcm_u24be_demuxer,
        &ff_pcm_u24le_demuxer,
        &ff_pcm_u16be_demuxer,
        &ff_pcm_u16le_demuxer,
        &ff_pcm_u8_demuxer,
        &ff_pjs_demuxer,
        &ff_pmp_demuxer,
        &ff_pva_demuxer,
        &ff_pvf_demuxer,
        &ff_qcp_demuxer,
        &ff_r3d_demuxer,
        &ff_rawvideo_demuxer,
        &ff_realtext_demuxer,
        &ff_redspark_demuxer,
        &ff_rl2_demuxer,
        &ff_rm_demuxer,
        &ff_roq_demuxer,
        &ff_rpl_demuxer,
        &ff_rsd_demuxer,
        &ff_rso_demuxer,
        &ff_rtp_demuxer,
        &ff_rtsp_demuxer,
        &ff_s337m_demuxer,
        &ff_sami_demuxer,
        &ff_sap_demuxer,
        &ff_sbc_demuxer,
        &ff_sbg_demuxer,
        &ff_scc_demuxer,
        &ff_sdp_demuxer,
        &ff_sdr2_demuxer,
        &ff_sds_demuxer,
        &ff_sdx_demuxer,
        &ff_segafilm_demuxer,
        &ff_ser_demuxer,
        &ff_shorten_demuxer,
        &ff_siff_demuxer,
        &ff_sln_demuxer,
        &ff_smacker_demuxer,
        &ff_smjpeg_demuxer,
        &ff_smush_demuxer,
        &ff_sol_demuxer,
        &ff_sox_demuxer,
        &ff_spdif_demuxer,
        &ff_srt_demuxer,
        &ff_str_demuxer,
        &ff_stl_demuxer,
        &ff_subviewer1_demuxer,
        &ff_subviewer_demuxer,
        &ff_sup_demuxer,
        &ff_svag_demuxer,
        &ff_swf_demuxer,
        &ff_tak_demuxer,
        &ff_tedcaptions_demuxer,
        &ff_thp_demuxer,
        &ff_threedostr_demuxer,
        &ff_tiertexseq_demuxer,
        &ff_tmv_demuxer,
        &ff_truehd_demuxer,
        &ff_tta_demuxer,
        &ff_txd_demuxer,
        &ff_tty_demuxer,
        &ff_ty_demuxer,
        &ff_v210_demuxer,
        &ff_v210x_demuxer,
        &ff_vag_demuxer,
        &ff_vc1_demuxer,
        &ff_vc1t_demuxer,
        &ff_vividas_demuxer,
        &ff_vivo_demuxer,
        &ff_vmd_demuxer,
        &ff_vobsub_demuxer,
        &ff_voc_demuxer,
        &ff_vpk_demuxer,
        &ff_vplayer_demuxer,
        &ff_vqf_demuxer,
        &ff_w64_demuxer,
        &ff_wav_demuxer,
        &ff_wc3_demuxer,
        &ff_webm_dash_manifest_demuxer,
        &ff_webvtt_demuxer,
        &ff_wsaud_demuxer,
        &ff_wsd_demuxer,
        &ff_wsvqa_demuxer,
        &ff_wtv_demuxer,
        &ff_wve_demuxer,
        &ff_wv_demuxer,
        &ff_xa_demuxer,
        &ff_xbin_demuxer,
        &ff_xmv_demuxer,
        &ff_xvag_demuxer,
        &ff_xwma_demuxer,
        &ff_yop_demuxer,
        &ff_yuv4mpegpipe_demuxer,
        &ff_image_bmp_pipe_demuxer,
        &ff_image_dds_pipe_demuxer,
        &ff_image_dpx_pipe_demuxer,
        &ff_image_exr_pipe_demuxer,
        &ff_image_gif_pipe_demuxer,
        &ff_image_j2k_pipe_demuxer,
        &ff_image_jpeg_pipe_demuxer,
        &ff_image_jpegls_pipe_demuxer,
        &ff_image_pam_pipe_demuxer,
        &ff_image_pbm_pipe_demuxer,
        &ff_image_pcx_pipe_demuxer,
        &ff_image_pgmyuv_pipe_demuxer,
        &ff_image_pgm_pipe_demuxer,
        &ff_image_pictor_pipe_demuxer,
        &ff_image_png_pipe_demuxer,
        &ff_image_ppm_pipe_demuxer,
        &ff_image_psd_pipe_demuxer,
        &ff_image_qdraw_pipe_demuxer,
        &ff_image_sgi_pipe_demuxer,
        &ff_image_svg_pipe_demuxer,
        &ff_image_sunrast_pipe_demuxer,
        &ff_image_tiff_pipe_demuxer,
        &ff_image_webp_pipe_demuxer,
        &ff_image_xpm_pipe_demuxer,
        &ff_image_xwd_pipe_demuxer,
        NULL };
    
    
    // 举例说明
    
    
    AVInputFormat ff_aac_demuxer = {
        .name         = "aac",
        .long_name    = NULL_IF_CONFIG_SMALL("raw ADTS AAC (Advanced Audio Coding)"),
        .read_probe   = adts_aac_probe,
        .read_header  = adts_aac_read_header,
        .read_packet  = adts_aac_read_packet,
        .flags        = AVFMT_GENERIC_INDEX,
        .extensions   = "aac",
        .mime_type    = "audio/aac,audio/aacp,audio/x-aac",
        .raw_codec_id = AV_CODEC_ID_AAC,
    };
    

    4.. indev_list的定义位于libavdevice/indev_list.c

    static const AVInputFormat * const indev_list[] = {
        &ff_alsa_demuxer,
        &ff_fbdev_demuxer,
        &ff_lavfi_demuxer,
        &ff_oss_demuxer,
        &ff_sndio_demuxer,
        &ff_v4l2_demuxer,
        &ff_xcbgrab_demuxer,
        NULL 
    };
    
    // 举例说明
    AVInputFormat ff_lavfi_demuxer = {
        .name           = "lavfi",
        .long_name      = NULL_IF_CONFIG_SMALL("Libavfilter virtual input device"),
        .priv_data_size = sizeof(LavfiContext),
        .read_header    = lavfi_read_header,
        .read_packet    = lavfi_read_packet,
        .read_close     = lavfi_read_close,
        .flags          = AVFMT_NOFILE,
        .priv_class     = &lavfi_class,
    };
    

    AVOutputFormat

    1. AVOutputFormat是muxer或者outdev

        AVOutputFormat *prevout = NULL, *out;
        for (int i = 0; (out = (AVOutputFormat*)muxer_list[i]); i++) {
            if (prevout)
                prevout->next = out;
            prevout = out;
        }
    
        if (outdev_list) {
            for (int i = 0; (out = (AVOutputFormat*)outdev_list[i]); i++) {
                if (prevout)
                    prevout->next = out;
                prevout = out;
            }
        }
    

    2. AVOutputFormat的声明

    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.
         *****************************************************************
         */
        /**
         * The ff_const59 define is not part of the public API and will
         * be removed without further warning.
         */
    #if FF_API_AVIOFORMAT
    #define ff_const59
    #else
    #define ff_const59 const
    #endif
        ff_const59 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.
         *
         * Return 0 if streams were fully configured, 1 if not, negative AVERROR on failure
         *
         * 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. muxer_list的定义位于libavformat/muxer_list.c

    static const AVOutputFormat * const muxer_list[] = {
        &ff_a64_muxer,
        &ff_ac3_muxer,
        &ff_adts_muxer,
        &ff_adx_muxer,
        &ff_aiff_muxer,
        &ff_amr_muxer,
        &ff_apng_muxer,
        &ff_aptx_muxer,
        &ff_aptx_hd_muxer,
        &ff_asf_muxer,
        &ff_ass_muxer,
        &ff_ast_muxer,
        &ff_asf_stream_muxer,
        &ff_au_muxer,
        &ff_avi_muxer,
        &ff_avm2_muxer,
        &ff_avs2_muxer,
        &ff_bit_muxer,
        &ff_caf_muxer,
        &ff_cavsvideo_muxer,
        &ff_codec2_muxer,
        &ff_codec2raw_muxer,
        &ff_crc_muxer,
        &ff_dash_muxer,
        &ff_data_muxer,
        &ff_daud_muxer,
        &ff_dirac_muxer,
        &ff_dnxhd_muxer,
        &ff_dts_muxer,
        &ff_dv_muxer,
        &ff_eac3_muxer,
        &ff_f4v_muxer,
        &ff_ffmetadata_muxer,
        &ff_fifo_muxer,
        &ff_fifo_test_muxer,
        &ff_filmstrip_muxer,
        &ff_fits_muxer,
        &ff_flac_muxer,
        &ff_flv_muxer,
        &ff_framecrc_muxer,
        &ff_framehash_muxer,
        &ff_framemd5_muxer,
        &ff_g722_muxer,
        &ff_g723_1_muxer,
        &ff_g726_muxer,
        &ff_g726le_muxer,
        &ff_gif_muxer,
        &ff_gsm_muxer,
        &ff_gxf_muxer,
        &ff_h261_muxer,
        &ff_h263_muxer,
        &ff_h264_muxer,
        &ff_hash_muxer,
        &ff_hds_muxer,
        &ff_hevc_muxer,
        &ff_hls_muxer,
        &ff_ico_muxer,
        &ff_ilbc_muxer,
        &ff_image2_muxer,
        &ff_image2pipe_muxer,
        &ff_ipod_muxer,
        &ff_ircam_muxer,
        &ff_ismv_muxer,
        &ff_ivf_muxer,
        &ff_jacosub_muxer,
        &ff_latm_muxer,
        &ff_lrc_muxer,
        &ff_m4v_muxer,
        &ff_md5_muxer,
        &ff_matroska_muxer,
        &ff_matroska_audio_muxer,
        &ff_microdvd_muxer,
        &ff_mjpeg_muxer,
        &ff_mlp_muxer,
        &ff_mmf_muxer,
        &ff_mov_muxer,
        &ff_mp2_muxer,
        &ff_mp3_muxer,
        &ff_mp4_muxer,
        &ff_mpeg1system_muxer,
        &ff_mpeg1vcd_muxer,
        &ff_mpeg1video_muxer,
        &ff_mpeg2dvd_muxer,
        &ff_mpeg2svcd_muxer,
        &ff_mpeg2video_muxer,
        &ff_mpeg2vob_muxer,
        &ff_mpegts_muxer,
        &ff_mpjpeg_muxer,
        &ff_mxf_muxer,
        &ff_mxf_d10_muxer,
        &ff_mxf_opatom_muxer,
        &ff_null_muxer,
        &ff_nut_muxer,
        &ff_oga_muxer,
        &ff_ogg_muxer,
        &ff_ogv_muxer,
        &ff_oma_muxer,
        &ff_opus_muxer,
        &ff_pcm_alaw_muxer,
        &ff_pcm_mulaw_muxer,
        &ff_pcm_vidc_muxer,
        &ff_pcm_f64be_muxer,
        &ff_pcm_f64le_muxer,
        &ff_pcm_f32be_muxer,
        &ff_pcm_f32le_muxer,
        &ff_pcm_s32be_muxer,
        &ff_pcm_s32le_muxer,
        &ff_pcm_s24be_muxer,
        &ff_pcm_s24le_muxer,
        &ff_pcm_s16be_muxer,
        &ff_pcm_s16le_muxer,
        &ff_pcm_s8_muxer,
        &ff_pcm_u32be_muxer,
        &ff_pcm_u32le_muxer,
        &ff_pcm_u24be_muxer,
        &ff_pcm_u24le_muxer,
        &ff_pcm_u16be_muxer,
        &ff_pcm_u16le_muxer,
        &ff_pcm_u8_muxer,
        &ff_psp_muxer,
        &ff_rawvideo_muxer,
        &ff_rm_muxer,
        &ff_roq_muxer,
        &ff_rso_muxer,
        &ff_rtp_muxer,
        &ff_rtp_mpegts_muxer,
        &ff_rtsp_muxer,
        &ff_sap_muxer,
        &ff_sbc_muxer,
        &ff_scc_muxer,
        &ff_segafilm_muxer,
        &ff_segment_muxer,
        &ff_stream_segment_muxer,
        &ff_singlejpeg_muxer,
        &ff_smjpeg_muxer,
        &ff_smoothstreaming_muxer,
        &ff_sox_muxer,
        &ff_spx_muxer,
        &ff_spdif_muxer,
        &ff_srt_muxer,
        &ff_sup_muxer,
        &ff_swf_muxer,
        &ff_tee_muxer,
        &ff_tg2_muxer,
        &ff_tgp_muxer,
        &ff_mkvtimestamp_v2_muxer,
        &ff_truehd_muxer,
        &ff_tta_muxer,
        &ff_uncodedframecrc_muxer,
        &ff_vc1_muxer,
        &ff_vc1t_muxer,
        &ff_voc_muxer,
        &ff_w64_muxer,
        &ff_wav_muxer,
        &ff_webm_muxer,
        &ff_webm_dash_manifest_muxer,
        &ff_webm_chunk_muxer,
        &ff_webp_muxer,
        &ff_webvtt_muxer,
        &ff_wtv_muxer,
        &ff_wv_muxer,
        &ff_yuv4mpegpipe_muxer,
        NULL };
    
    // 举例说明
    AVOutputFormat ff_h264_muxer = {
        .name              = "h264",
        .long_name         = NULL_IF_CONFIG_SMALL("raw H.264 video"),
        .extensions        = "h264,264",
        .audio_codec       = AV_CODEC_ID_NONE,
        .video_codec       = AV_CODEC_ID_H264,
        .write_header      = force_one_stream,
        .write_packet      = ff_raw_write_packet,
        .check_bitstream   = h264_check_bitstream,
        .flags             = AVFMT_NOTIMESTAMPS,
    };
    

    4. outdev_list的定义位于libavdevice/outdev_list.c

    static const AVOutputFormat * const outdev_list[] = {
        &ff_alsa_muxer,
        &ff_fbdev_muxer,
        &ff_oss_muxer,
        &ff_sdl2_muxer,
        &ff_sndio_muxer,
        &ff_v4l2_muxer,
        &ff_xv_muxer,
        NULL 
    };
    
    AVOutputFormat ff_sdl2_muxer = {
        .name           = "sdl,sdl2",
        .long_name      = NULL_IF_CONFIG_SMALL("SDL2 output device"),
        .priv_data_size = sizeof(SDLContext),
        .audio_codec    = AV_CODEC_ID_NONE,
        .video_codec    = AV_CODEC_ID_RAWVIDEO,
        .write_header   = sdl2_write_header,
        .write_packet   = sdl2_write_packet,
        .write_trailer  = sdl2_write_trailer,
        .flags          = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS,
        .priv_class     = &sdl2_class,
    };
    
    

    结论

    AVInputFormat可以理解为demuxer, AVOutputFormat可以理解为muxer

  • 相关阅读:
    A* Pathfinding for Beginners
    OpenGL Draw Mesh
    CentOS6.5下安装、配置SSH
    Ubuntu18.04下搭建LAMP环境
    滚动合集
    关闭页面触发事件
    在table中tr的display:block在firefox下显示布局错乱问题
    sharepoint添加模板及删除模板
    常用正则表达式
    javascript对象的property和prototype是这样一种关系
  • 原文地址:https://www.cnblogs.com/faithlocus/p/15836378.html
Copyright © 2020-2023  润新知