avformat_find_stream_info

```

// 类似于一个接口类,多态为每一个容器格式,mp4,flv等等,还有一堆read_header,read_probe等接口函数

// 是解复用对象,每一种文件容器格式对应一个AVInputFormat,在程序运行时有多个实例。

// 在ffmpeg初始化时,把所有的容器格式通过next组成链表,查找也是通过遍历链表就行查找。

// 以MP3为例

 AVInputFormat ff_mp3_demuxer = {

    .name = "mp3",

    .long_name = NULL_IF_CONFIG_SMALL("MP2/3 (MPEG audio layer 2/3)"),

    .read_probe = mp3_read_probe,

    .read_header = mp3_read_header,

    .read_packet = mp3_read_packet,

    .read_seek = mp3_seek,

    .priv_data_size = sizeof(MP3DecContext),

    .flags = AVFMT_GENERIC_INDEX,

    .extensions = "mp2,mp3,m2a,mpa",

    .priv_class = &demuxer_class,

}

 

typedef struct AVInputFormat {

    //格式的短名称,例子中就是mp3

    const char *name; 

    //格式的长名称,egg中的"MP2/3 (MPEG audio layer 2/3)"

    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;

     ///< AVClass for the private context 用于内部的Context

    const AVClass *priv_class;

    //mime类型,如video/avc,在probing时需要检查

    const char *mime_type; 

 

 

    //**************************下面都是非公共字段**************************************\

    //链表指针,指向下一个AVInputFormat

    struct AVInputFormat *next;

    //原始Demuxer存储的codec_id

    int raw_codec_id; 

    //某种格式文件的数据大小

    int priv_data_size; 

    //读取probe数据,提供的probe数据必须保证AVPROBE_PADDING_SIZE

    int (*read_probe)(AVProbeData *); 

    //读取format头并初始化AVFormatContext结构,返回0,表示ok

    int (*read_header)(struct AVFormatContext *);

    //读取一个packet,并保存到传入的pkt指针中

    int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); 

    //关闭流

    int (*read_close)(struct AVFormatContext *);

    //seek到给定的时间戳

    int (*read_seek)(struct AVFormatContext *,int stream_index, int64_t timestamp, int flags); 

    //读取给定的时间戳

    int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit);

    //开始/恢复播放,仅仅在网络协议RTSP下才有意义

    int (*read_play)(struct AVFormatContext *); 

     //暂停,仅仅在网络协议RTSP下才有意义

    int (*read_pause)(struct AVFormatContext *);

     //快进快退到指定时间戳

    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;

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值