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:
