当前位置: 代码迷 >> 综合 >> FFmpeg:AVInputFormat结构体解析
  详细解决方案

FFmpeg:AVInputFormat结构体解析

热度:28   发布时间:2024-02-05 17:40:18.0

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 contextconst char *mime_type; // mime类型,它用于在探测时检查匹配的mime类型。/* 此行下方的任何字段都不是公共API的一部分。 它们不能在libavformat之外使用,可以随意更改和删除。* 应在上方添加新的公共字段。*/struct AVInputFormat *next; // 用于链接下一个AVInputFormatint 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_VALUEint64_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;
    

 

  相关解决方案