AvFrame和AvPacket

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

在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;
 
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值