FFmpeg:AVInputFormat结构体解析

VInputFormat是解复用器(解封装)作用时读取媒体文件并将其拆分为数据块(数据包)。每个数据包,包含一个或者多个编码帧

比较重要的字段有:

  • long_name:格式的长名称(相对于短名称而言,更易于阅读)。
  • mime_type:mime类型,它用于在探测时检查匹配的mime类型。
  • next:用于链接下一个AVInputFormat。
  • (*read_probe):判断给定文件是否有可能被解析为此格式。 提供的缓冲区保证为AVPROBE_PADDING_SIZE字节大,因此除非您需要更多,否则无需检查。
  • (*read_header):读取格式头,并初始化AVFormatContext结构体。
  • (*read_packet):读取一个packet并存入pkt指针中。

结构定义及成员解读

  • typedef struct AVInputFormat {
        const char *name; // 输入格式的短名称
        const char *long_name; // 格式的长名称(相对于短名称而言,更易于阅读)
        /**
         * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
         * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
         * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
         */
        int flags;
        const char *extensions; // 如果定义了扩展,就不会进行格式探测。但因为该功能目前支持不够,不推荐使用
        const struct AVCodecTag * const *codec_tag; // 见名知意
        const AVClass *priv_class; ///< AVClass for the private context
        const char *mime_type; // mime类型,它用于在探测时检查匹配的mime类型。
    		/* 此行下方的任何字段都不是公共API的一部分。 它们不能在libavformat之外使用,可以随意更改和删除。
    		 * 应在上方添加新的公共字段。*/
        struct AVInputFormat *next; // 用于链接下一个AVInputFormat
        int raw_codec_id; // 原始demuxers将它们的解码器id保存在这里。
        int priv_data_size; // 私有数据大小,可以用于确定需要分配多大的内存来容纳下这些数据。
    		/**
    		 * 判断给定文件是否有可能被解析为此格式。 提供的缓冲区保证为AVPROBE_PADDING_SIZE字节大,因此除非您需		 * 要更多,否则无需检查。
    		 */
        int (*read_probe)(AVProbeData *);
        /**
         * 读取格式头,并初始化AVFormatContext结构体
         * @return 0 表示操作成功
         */
        int (*read_header)(struct AVFormatContext *);
        /**
         * 读取一个packet并存入pkt指针中。pts和flags会被同时设置。
         * @return 0 表示操作成功, < 0 发生异常
         *         当返回异常时,pkt可定没有allocated或者在函数返回之前被释放了。
         */
        int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
         // 关闭流,AVFormatContext和AVStreams并不会被这个函数释放。
        int (*read_close)(struct AVFormatContext *);
        /**
         * 在stream_index的流中,使用一个给定的timestamp,seek到附近帧。
         * @param stream_index 不能为-1
         * @param flags 如果没有完全匹配,决定向前还是向后匹配。
         * @return >= 0 成功
         */
        int (*read_seek)(struct AVFormatContext *,
                         int stream_index, int64_t timestamp, int flags);
        // 获取stream[stream_index]的下一个时间戳,如果发生异常返回AV_NOPTS_VALUE
        int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                                  int64_t *pos, int64_t pos_limit);
        // 开始或者恢复播放,只有在播放rtsp格式的网络格式才有意义。
        int (*read_play)(struct AVFormatContext *);
        int (*read_pause)(struct AVFormatContext *);// 暂停播放,只有在播放rtsp格式的网络格式才有意义。
        /**
         * 快进到指定的时间戳
         * @param stream_index 需要快进操作的流
         * @param ts 需要快进到的地方
         * @param min_ts max_ts seek的区间,ts需要在这个范围中。
         */
        int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
        // 返回设备列表和其属性
        int (*get_device_list)(struct AVFormatContext *s, struct AVDeviceInfoList *device_list);
        // 初始化设备能力子模块
        int (*create_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
        // 释放设备能力子模块
        int (*free_device_capabilities)(struct AVFormatContext *s, struct AVDeviceCapabilitiesQuery *caps);
    } AVInputFormat;
    

猜你喜欢

转载自blog.csdn.net/cindywry/article/details/107759314
今日推荐