在FFmpeg中,未压缩的图像和压缩的视频码流分别使用AVFrame结构和AVPacket结构保存; 针对视频编码器,其流程为从数据源获取图像格式的输入数据,保存为AVFrame对象并传入编码器,从编码器输出AVPacket结构。
1. AVFrame结构体
typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8 //表示一个AVFrame结构最多保存8个图像分量;
//待编码的图像像素数据保存在其中,各图像分量的像素数据保存在AVframe::data[0]~data[7]
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS]; //每个分量的存储区的宽度,称为步长;
/*指向数据平面/通道的指针。
对于视频,指向data[]
对于planar音频,每个通道有分离的数据指针,且linesize[0]包含每个通道buffer的大小;
对于packed音频,仅仅是一个数据指针,且linesize[0]包含所有通道buffer的总大小;
*/
uint8_t **extended_data;
//图像宽高
int width, height;
//本帧描述的音频采样数(每个频道)
int nb_samples;
//帧格式,常见的为AV_PIX_FMT_YUV420P
int format;
int key_frame; //当前帧的关键帧标识位;1表该帧为关键帧;0表非关键帧;
enum AVPictureType pict_type;//当前帧的类型,0,1,2分别表示I帧,P帧,B帧;
//采样视频帧的长宽比,如果未知/未指定,则为0/1;
AVRational sample_aspect_ratio;
int64_t pts;//当前帧的显示时间戳;
#if FF_API_PKT_PTS
//PTS复制自AVPacket,被解码产生此帧。
int64_t pkt_pts;
#endif
//dts从触发返回帧的AVPacket中复制
//这也是由AVPacket计算出的AVFrame的显示时间。 无PTS值的DTS值
int64_t pkt_dts;
//按位流顺序排列的图片编号
int coded_picture_number;
//图片编号按显示顺序排列
int display_picture_number;
//质量
int quality;
void *opaque; //用户私有数据
//当解码时,这表示图像必须延迟多少
int repeat_pict;

FFmpeg中的AVFrame结构用于存储未压缩的图像数据,包括像素数据、图像尺寸等信息,而AVPacket结构则用于保存压缩后的视频码流。编码流程包括从数据源获取图像,用AVFrame存储,然后传递给编码器,编码器输出AVPacket。AVFrame的内存分配通过av_frame_get_buffer()完成,编码器接收图像帧通过avcodec_send_frame(),编码后的码流通过avcodec_receive_packet()获取。

2338

被折叠的 条评论
为什么被折叠?



