FFMPEG开发快速入坑——视频转换处理

本章节重点讲解FFMPEG中对于视频图像格式转换的处理。


一、视频格式转换的基本API
视频帧图像的格式转换、缩放等处理,主要使用 libswscale库中的API函数完成的

  1. sws_getContext() 根据要输入输出图像的 宽高和 像素格式 创建转换器
  2. sws_scale() 根据输入图像数据进行实际的转换操作,结果输出到输出缓冲区上
  3. sws_freeContext()释放转换器

这几个API函数的功能比较明确,关键是参数的设置,特别是sws_scale()几个参数的设置,具体的参数值依赖于相应的视频帧图像格式。

二、常用的视频帧图像格式

  1. YUV420P格式

在YUV420P的存储格式中,每4个像素点占用4个Y、1个U、1个V,Y分量、U分量、V分量的数据分别单独存放,对应AVFrame结构体中字段

typedef struct AVFrame {
  ......
  //
  // 视频帧图像数据 或者 音频帧PCM数据, 根据不同的格式有不同的存放方式
  // 对于视频帧:RGB/RGBA 格式时 data[0] 中一次存放每个像素的RGB/RGBA数据
  //            YUV420 格式时 data[0]存放Y数据;  data[1]存放U数据; data[2]存放V数据
  // 对于音频帧: data[0]存放左声道数据;  data[1]存放右声道数据
  //
  uint8_t *data[AV_NUM_DATA_POINTERS];  
  
  //
  // 行字节跨度, 相当于stride
  // 对于视频帧: 上下两行同一列像素相差的字节数,例如:对于RGBA通常是(width*4), 但是有时FFMPEG内部会有扩展, 可能会比这个值大
  // 对于音频帧: 单个通道中所有采样占用的字节数
  //
  int linesize[AV_NUM_DATA_POINTERS];
  
  int format;         // 对于视频帧是图像格式; 对于音频帧是采样格式  
  int64_t pts;        // 当前数据帧的时间戳  
  int width, height;  // 仅用于视频帧, 宽度高度
  int key_frame;      // 仅用于视频, 当前是否是I帧
  ......
}

以一张 720*1280的视频帧图像为例&#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值