AVFormatContext 结构体分析

博客介绍了FFMpeg中最基本的AVFormatContext结构体,它是多媒体文件或流的根本抽象。详细阐述了该结构体的多个成员,如用于日志记录的av_class、输入输出容器格式、流信息、文件名、url等,还说明了各成员在解封装和加封装时的赋值情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个结构体描述了一个媒体文件或媒体流的构成和基本信息。这是FFMpeg中最为基本的一个结构,是其他所有结构的根,是一个多媒体文件或流的根本抽象。

AVFormatContext 是一个结构体
  //用于日志记录和avoptions类的引用。由avformat_alloc_context () 赋值。导出(de)muxer私有选项(如果存在的话)
  const AVClass *av_class;

//输入容器的格式,只有在解封装的时候,由avformat_open_input() 函数赋值
  ff_const59 struct AVInputFormat *iformat;

//输出容器的格式,只有在加封装的时候,必须由调用者在avformat_write_header()之前设置
  ff_const59 struct AVOutputFormat *oformat;

//AVFormatContext.streams中的元素数量。由avformat_new_stream()设置,不能被任何其他代码修改
  unsigned int nb_streams;

//文件中所有流的列表。使用avformat_new_stream()创建新流
  //解封装:流是由avformat_open_input()中的libavformat创建的。如果在ctx_flags中设置了AVFMTCTX_NOHEADER,那么新的流也可能出现在av_read_frame()中
  //加封装:流是由用户在avformat_write_header()之前创建的
  AVStream **streams;

//输入或输出的文件名
  //解封装:由函数avformat_open_input()赋值
  //封装:由用户在avformat_write_header()之前创建的
  //@deprecated 已使用url代替
  char filename[1024];

//输入或输出的url,不像旧版的filename字段,它没有长度限制
  //解封装:由avformat_open_input函数赋值,如果url参数为空的情况下,赋值一个空字符串
  //加封装:可以由调用者在调用avformat_write_header()(或avformat_init_output()(如果先调用它)到av_free()可释放的字符串之前进行设置。如果avformat_init_output()中的字符串为空,则将其设置为空字符串
  //由libavformat 模块中的avformat_free_context()函数释放
  char *url;

//第一个数据帧的开始时间,单位为AV_TIME_BASE,不要直接设置该值,它是由AVSTREAM值推导出来。
  //只在解封装的时候有意义,由libavformat模块赋值
  int64_t start_time;

//数据流的时长,单位为AV_TIME_BASE,只有在不知道单个流持续时间的情况下才设置此值,否则不要设置该值。这是从AVStream值推导出来的,如果没有设置
  //只在解封装的时候有意义,由libavformat模块赋值
  int64_t duration;

//总流比特率,以比特/秒为单位,如果不可用,则为0。如果file_size和持续时间是FFmpeg可以自动计算的,就不要直接设置它
  int64_t bit_rate;
  unsigned int packet_size;
  int max_delay;

//强制视频编解码器id,解封装的时候由用户设置
  enum AVCodecID video_codec_id;
  AVCodec *video_codec;

//强制音频编解码id,解封装的时候由用户设置
  enum AVCodecID audio_codec_id;
  AVCodec *audio_codec;

//强制字幕编解码id,解封装的时候由用户设置
  enum AVCodecID subtitle_codec_id;
  AVCodec *subtitle_codec;

//应用于整个文件的元数据
  //解封装的时候,由libavformat模块的avformat_open_input函数赋值
  //加封装的时候,需在用户调用avformat_write_header()函数前赋值
  //由libavformat模块在avformat_free_context()中释放
   AVDictionary *metadata;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值