FFmpeg中那个包含众多属性的关键结构体叫什么?

摘要:[[N_FFmpeg]] 一些重要的结构体 FFMPEG中结构体很多; 最关键的结构体可以分成以下几类: 解协议(http,rtsp,rtmp,mms) AVIOContext, URLProtocol, URLContext 主要存储视音
[[N_FFmpeg]] 一些重要的结构体 FFMPEG中结构体很多; 最关键的结构体可以分成以下几类: 解协议(http,rtsp,rtmp,mms) AVIOContext, URLProtocol, URLContext 主要存储视音频使用的协议的类型以及状态; URLProtocol存储输入视音频使用的封装格式; 每种协议都对应一个 URLProtocol 结构; (注意: FFMPEG中文件也被当做一种协议"file") 解封装(flv,avi,rmvb,mp4) AVFormatContext 主要存储视音频封装格式中包含的信息; AVInputFormat存储输入视音频使用的封装格式; 每种视音频封装格式都对应一个AVInputFormat 结构; 解码(h264,mpeg2,aac,mp3) 每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext, 存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec, 包含该视频/音频对应的解码器; 每种解码器都对应一个AVCodec结构; 存数据 视频的话, 每个结构一般是存一帧; 音频可能有好几帧 解码前数据: AVPacket 解码后数据: AVFrame 参考雷神博客-FFMPEG中最关键的结构体之间的关系 ffmpeg库函数介绍 FFmpeg 学习整理总结 AVFormatContext 可以理解为整个统领上下文的大结构体, 包含: 多个AVStream(streams), AVCodec, AVCodecContext 对应封装格式例如 (mp3/mp4/avi...) 格式转换过程中实现输入和输出功能, 保存相关数据的主要结构, 描述了一个媒体文件或媒体流的构成和基本信息 nb_streams/streams: AVStream结构指针数组, 包含了所有内嵌媒体流的描述, 其内部有 AVInputFormat + AVOutputFormat 结构体, 来表示输入输出的文件格式 avformat_open_input: 创建并初始化部分值, 但其他一些值(如 mux_rate, key 等)需要手工设置初始值, 否则可能出现异常 avformat_alloc_output_context2: 根据文件的输出格式, 扩展名或文件名等分配合适的 AVFormatContext 结构 获取 AVFormatContext fmt_ctx = nullptr; avformat_open_input(&fmt_ctx, "filename", nullptr, nullptr);//打开一个输入 //然后使用 读取 if((avformat_find_stream_info(avFormatCtx,nullptr))!=0){ //reaad error } //或者 AVFormatContext *avformat_alloc_context(void); 每一个 AVFormatContext 都有AVStream **streams;属性; 而nb_streams属性对应着索引 销毁 avformat_free_context() API doc pd 属性 (内存读写数据) 参考下 #ffmpeg内存编解码 AVStream 可理解为 "流通道", 例如视频一般会有两个, 音频流和视频流, 保存着解码方式的相关数据 AVStream -- 描述一个媒体流, 其大部分信息可通过 avformat_open_input 根据文件头信息确定, 其他信息可通过 avformat_find_stream_info 获取, 典型的有 视频流, 中英文音频流, 中英文字幕流(Subtitle), 可通过 av_new_stream, avformat_new_stream 等创建; index: 在AVFormatContext中流的索引, 其值自动生成(AVFormatContext::streams[index]) nb_frames: 流内的帧数目 time_base: 流的时间基准, 是一个实数, 该流中媒体数据的pts和dts都将以这个时间基准为粒度; 通常, 使用av_rescale/av_rescale_q可以实现不同时间基准的转换 avformat_find_stream_info: 获取必要的编解码器参数(如 AVMediaType, CodecID ), 设置到 AVFormatContext::streams[i]::codec 中 av_read_frame:
阅读全文