讲解FFmpeg多媒体格式转换之前先讲下我们在格式转换过程中需要用到的API及FFmpeg相关的结构体介绍,通过这篇文章介绍在来学习多媒体格式转换时脑海中就会对整个流程有一个清晰的思路。
API列表介绍
-
avformat_open_input()
打开输入文件并创建封装格式AVFormatContext
-
avformat_alloc_output_context2()/avformat_free_context()
输出多媒体文件上下文,对应的是avformat_alloc_input_context2()
输入多媒体上下文 -
avformat_new_stream()
创建一个新的音视频流 -
avcodec_parameters_copy()
拷贝多媒体参数信息,多媒体数据中有很多参数,比如视频帧率,音频采样率等等,因为我们只是转换格式,需要将原来的参数复制到新的多媒体数据中
多媒体文件写入相关的API
-
avio_open()
打开封装格式上下文中的AVIOContext *pb
,打开之后才能给往AVFormatContext
中写入数据 -
avformat_write_header()
,FFmpeg将它支持的所有多媒体格式头封装成流的api,只需要调用这个函数FFmpeg会通过格式判断来写入相应头多媒体头信息 -
av_write_frame()/av_interleaved_write_frame()
写入多媒体信息,两个函数都可以写入多媒体文件 -
av_write_trailer()
写入多媒体尾部信息,与头部信息对应。
相关结构体介绍:
-
struct AVFormatContext
:封装格式的上下文,用于存储所有都视频信息,其内部重要变量如下
struct AVInputFormat *iformat:输入数据的封装格式
AVIOContext *pb:输入数据的缓存
unsigned int nb_streams:视音频流的个数
AVStream **streams:视音频流
char filename[1024]:文件名
int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)
int bit_rate:比特率(单位bps,转换为kbps需要除以1000)
AVDictionary *metadata:元数据
-
struct AVStream
是存储每一个视频/音频流信息的结构体,下面是结构体中的重要变量如下:
int index:标识该视频/音频流
AVCodecContext *codec:指向该视频/音频流的>
AVCodecContext(它们是一一对应的关系)
AVRational time_base:时基。通过该值可以把PTS,DTS转化为真正的时间。FFMPEG其他结构体中也有这个字段,但是根据我的经验,只有AVStream中的time_base是可用的。PTS*time_base=真正的时间
int64_t duration:该视频/音频流长度
AVDictionary *metadata:元数据信息
AVRational avg_frame_rate:帧率(注:对视频来说,这个挺重要的)
AVPacket attached_pic:附带的图片。比如说一些MP3,AAC音频文件附带的专辑封面。
-
struct AVIOContext
是FFMPEG管理输入输出数据的结构体。AVIOContext中有以下几个变量比较重要:
unsigned char *buffer:缓存开始位置
int buffer_size:缓存大小(默认32768)
unsigned char *buf_ptr:当前指针读取到的位置
unsigned char *buf_end:缓存结束的位置
void *opaque:URLContext结构
-
struct AVPacket
是存储压缩编码数据相关信息的结构体,重要的变量有以下几个:
uint8_t *data:压缩编码的数据。
例如对于H.264来说。1个AVPacket的data通常对应一个NAL。
注意:在这里只是对应,而不是一模一样。他们之间有微小的差别:使用FFMPEG类库分离出多媒体文件中的H.264码流
因此在使用FFMPEG进行视音频处理的时候,常常可以将得到的AVPacket的data数据直接写成文件,从而得到视音频的码流文件。
int size:data的大小
int64_t pts:显示时间戳
int64_t dts:解码时间戳
int stream_index:标识该AVPacket所属的视频/音频流。
最后附一张FFmpeg关键结构体的关系图:
FFmeag中最关键的结构体之间的关系参考资料:雷霄骅 FFmpeg结构体介绍
网友评论