ffmpeg视频格式和结构体

这把我C 2021-04-25 16:34:01 4275

1 视频

img点击并拖拽以移动

1.1 视频像素格式

  • ARGB_8888 : 常见的图像像素编码格式,用 4 个字节分别存储图像的 A 透明度信息, R 红色通道信 息, G 绿色通道信息, B 蓝色通道信息。
  • YUV : YUV像素格式来源于RGB像素格式,通过公式运算,YUV三分量可以还原出RGB,YUV转RGB的 公式如下:

img点击并拖拽以移动

R = Y + 1.403V
G = Y - 0.344U - 0.714V
B = Y + 1.770U

一般,将 RGB 和 YUV 的范围均限制在 [0, 255] 间,则有如下转换公式:

R = Y + 1.403(V - 128)
G = Y - 0.344(U - 128) - 0.714(V - 128) 
B = Y + 1.770(U - 128)

YUV 格式根据采样方式不同又分为 YUV444 , YUV422 , YUV420 具体可以详细查询相关细节。

1.2 视频压缩格式

压缩格式 适用静态图或视频 特征描述 应用场景
JPEG / JPEG2000 静态图 JPEG / JPEG 2000利用的压缩算法不同 DSC等
M-JPEG 视频 只是由连续的JPEG图像组成 PC-CAM ,监控等
MPEG1 视频 MPEG 组织定义的 VCD 应用程序的 标准 VCD 等
MPEG2 视频 MPEG 组织定义的 DVD ,DVB 应用程序的标准 DVD ,DVB ,监控等
MPEG4 视频 MPEG 组织定义的网络应用程序的标准 监控VOD ,IPTV ,PMP等
H.261 视频 国际电联定义 基本 互联网多媒体应 监控,视频会议等 用标准
H.263 视频 国际电联定义 低带宽 互联网多媒体 应用标准 监控,视频会议等
H.264 视频 具有更高压缩效率的下一代标准 IPTV ,监控 ,多媒体 等
WMV9 视频 微软定义的下一代标准 IPTV , VOD
AVS1.0 视频 中国自有专利标准

2 音频

2.1 音频采样数据格式

3 FFmpeg 中几个重要的结构体

结构体一 AVPacket

// C
typedef struct AVPacket {
   AVBufferRef *buf; //用来管理data指针引用的数据缓存
   int64_t pts; //显示时间,结合AVStream->time_base转换成时间戳
   int64_t dts; //解码时间,结合AVStream->time_base转换成时间戳
   uint8_t *data; //★指向保存压缩数据的指针,这就是AVPacket的实际数据
   int size; //data的大小
   int stream_index; //packet在stream的index位置
   int flags; //标示,结合AV_PKT_FLAG使用,其中最低为1表示该数据是一个关键帧。
   /*
    * flags 可选:
    * #define AV_PKT_FLAG_KEY 0x0001 //关键帧
    * #define AV_PKT_FLAG_CORRUPT 0x0002 //损坏的数据
    * #define AV_PKT_FLAG_DISCARD 0x0004 /丢弃的数据
    */
   AVPacketSideData *side_data; //容器提供的一些附加数据
   int side_data_elems; //边缘数据元数个数
   int64_t duration; //数据的时长,以所属媒体流的时间基准为单位,未知则值为默认值0 
   int64_t pos; //数据在流媒体中的位置,未知则值为默认值-1
#if FF_API_CONVERGENCE_DURATION
   attribute_deprecated
   int64_t convergence_duration; //该字段已deprecated,不在使用 
#endif
} AVPacket;
  • AVPacket 结构体定义在 <libavcodec/avcodec.h> 中,看源码英文注释去这里找。
  • 简介: AVPacket是FFmpeg中很重要的一个数据结构,它保存了解复用(demuxer)之后,解码 (decode)之前的数据(仍然是压缩后的数据)和关于这些数据的一些附加的信息,如显示时间 戳(pts),解码时间戳(dts),数据时长(duration),所在流媒体的索引(stream_index)等 等。

结构体二 AVFrame

  • AVFrame 结构体定义在 <libavutil/frame.h> ,看源码去这里找,略长不粘。
  • 简介: AVFrame中存储的是经过解码后的原始数据。在解码中,AVFrame是解码器的输出;在编码 中,AVFrame是编码器的输入。

结构体三 AVFormatContext

  • AVFormatContext 结构体定义在 <libavformat/avformat.h> 中,看源码去这里找,略长不粘。
  • 简介:在使用 FFmpeg 进行开发的时候,AVFormatContext 是一个贯穿始终的数据结构,很多函数 都要用到它作为参数。它是 FFmpeg 解封装(flv,mp4,rmvb,avi)功能的结构体。下面看几个 主要变量的作用(在这里考虑解码的情况):
// C
struct AVInputFormat *iformat; //输入数据的封装格式
AVIOContext *pb; //输入数据的缓存
unsigned int nb_streams; //视音频流的个数
AVStream **streams; //视音频流
char filename[1024]; //文件名
int64_t duration; //时长(单位:微秒ms,转换为秒需要除以1_000_000)
int bit_rate; //比特率(单位bps,转换为kbps需要除以1_000) AVDictionary *metadata; //元数据

结构体四 AVCodecContext

  • AVCodecContext 结构体定义在 <libavcodec/avcodec.h> 中,看源码去这里找,略长不粘。
  • 简介: 一些关键的变量来看看(这里只考虑解码)。
// C
enum AVMediaType codec_type; //编解码器的类型(视频,音频...)
struct AVCodec *codec; //采用的解码器AVCodec(H.264,MPEG2...)
int bit_rate; //平均比特率
uint8_t *extradata; int extradata_size; //针对特定编码器包含的附加信息(例如对于H.264解码器来 说,存储SPS,PPS等)
AVRational time_base; //根据该参数,可以把PTS转化为实际的时间(单位为秒s)
int width, height; //如果是视频的话,代表宽和高
int refs; //运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了)
int sample_rate; //采样率(音频)
int channels; //声道数(音频)
enum AVSampleFormat sample_fmt; //采样格式
int profile; //型(H.264里面就有,其他编码标准应该也有)
int level; //级(和profile差不太多)

重要结构体之间的关系

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

img

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 95 7 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
关于作者
这把我C

这把我C

完整的教程https://fizzz.blog.csdn.net。该网站都是残缺

原创246
阅读236.7w
收藏88
点赞80
评论17
打赏用户 1
我要创作
分享技术经验,可获取创作收益
分类专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
这把我C
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区