技术专栏
ffmpeg视频格式和结构体
1 视频
1.1 视频像素格式
- ARGB_8888 : 常见的图像像素编码格式,用 4 个字节分别存储图像的 A 透明度信息, R 红色通道信 息, G 绿色通道信息, B 蓝色通道信息。
- YUV : YUV像素格式来源于RGB像素格式,通过公式运算,YUV三分量可以还原出RGB,YUV转RGB的 公式如下:
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
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
95
7
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:2573次2020-08-03 19:57:19
-
浏览量:6492次2021-04-26 17:28:30
-
浏览量:4483次2021-04-25 16:35:21
-
浏览量:4051次2020-08-26 17:39:57
-
浏览量:3516次2020-08-03 19:28:14
-
浏览量:4979次2021-04-25 16:34:37
-
浏览量:6213次2020-08-19 14:19:54
-
浏览量:1424次2024-02-27 17:03:43
-
浏览量:4409次2021-04-25 16:35:51
-
浏览量:4948次2021-04-26 17:29:53
-
浏览量:1115次2023-12-21 17:20:27
-
浏览量:1989次2022-11-21 17:11:41
-
浏览量:1094次2023-01-12 12:51:39
-
浏览量:5950次2021-07-01 16:47:45
-
浏览量:2892次2020-11-06 17:53:15
-
浏览量:4195次2020-11-06 17:11:49
-
浏览量:7448次2021-07-02 15:09:39
-
浏览量:986次2024-01-17 11:25:11
-
浏览量:5400次2021-04-23 14:10:42
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
这把我C
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注