视频基础知识
MPGEG-4
MPEG-4是一套用音视频信息的压缩编码标准
MPEG-4 Part 14 MPGEG-4文件格式 Part 15 AVC文件格式
H264(AVC Part10)
常用封装格式
AVI 压缩标准可任意选择 ,可以存不压缩的视频
FLV ts 流媒体格式
ASF 微软开发的
mp4
常用编码格式
视频 H264 (AVC Part10), wmv、 XviD(Part2), mjpeg(压缩率低,帧内编码,关键帧I多), 视频基本用有损压缩
音频 acc(视频中用acc做音频编码) MP3 ape flac,大部分无损压缩
封装格式和编码格式
像素格式
. BGRA RGBA ARGB32 RGB32 YUV420 其中‘A’表示透明通道
R = Y+1.4075*(V-128)
G=Y-0.3455*(U-128)-0.7169*(V-128)
B=Y+1.779*(U-128)
软解码:可解更高帧率
硬解码:GPU,功耗小,流畅,固定像素格式
YUV4:2:0 每4个Y共用一个色度
数据存放如果按平面格式§存放。Y,U,V分别用一个平面存放,uint8_t *data[3]
typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
uint8_t *data[AV_NUM_DATA_POINTERS];
int linesize[AV_NUM_DATA_POINTERS];
…
}
样本类型planar
AV_SAMPLE_FMT_S16 左右通道数据交叉存储
AV_SAMPLE_FMT_S16P 先第一个通道存储,然后第二个通道存储
重采样
什么是重采样
将音频三元组(采样率,采样大小和通道数)其中任意一个值发生改变就称为重采样, 例如48000/32/2 转成 44100/16/2。
为什么要重采样
1)从设备采集的音频数据与编码器要求的数据不一致。
2)扬声器要求的音频数据与要播放的音频数据不一致。
3)更方便运算(回音消除须使用单声道,需要先转换)
链接: 音频通道数、采样频率、采样位数、采样个数(样本数)的概念及计算一帧音频的大小、每秒播放的音频字节大小、一帧的播放时长、音频重采样.
MP4格式分析
H.264/AVC视频编码标准
https://blog.csdn.net/huabiaochen/article/details/120321905
链接: H264码流中SPS PPS SEI概念及详解.
I帧和IDR帧的区别
IDR(Instantaneous Decoder Refresh Frame),它不仅包含了I帧的所有特性,还起到刷新解码器状态的重要作用
1、I帧的所有特性: IDR帧是I帧的一种,因此具有I帧的自包含性和独立解码特性
2、刷新解码器:当解码器遇到 IDR 帧时,会立即刷新,丢弃之前所有未解码的参考帧。这保证了从 IDR 帧开始的解码过程不依赖于任何之前的帧,使错误不致传播
I 帧的特点
自包含性:I 帧不需要参考其他帧进行解码,可以独立解码。
高压缩率低:由于 I 帧包含完整的图像数据,其压缩率通常低于其他类型的帧(如 P 帧和 B 帧)。
解码起点:I 帧通常作为解码的起点,特别是在用户随机访问(如快进、快退)视频时
I 帧和 IDR 帧的区别
刷新解码器:IDR 帧刷新解码器状态,丢弃所有之前的参考帧,而普通的 I 帧不具备这个功能。
随机访问:IDR 帧是随机访问的理想点,因为从这个点开始的解码不依赖之前的任何数据,而 I 帧则可能依赖于之前的参考帧。
I 帧和 IDR 帧的区别
刷新解码器:IDR 帧刷新解码器状态,丢弃所有之前的参考帧,而普通的 I 帧不具备这个功能。
随机访问:IDR 帧是随机访问的理想点,因为从这个点开始的解码不依赖之前的任何数据,而 I 帧则可能依赖于之前的参考帧。
使用场景:IDR 帧通常用于需要严格同步和高可靠性的场景,如实时视频通信和流媒体;I 帧则更常见于普通的视频编码和存储中
AVFrame
AVFrame成员width和linesize的 区别
像素格式YUV420P,图片大小960*448, width是960, 如果是按64位对齐则Y分量linesize[0]: 1024, UV分量 linesize[1] = linesize[2] = 512,
对齐大小根据:
参考(链接: 色彩空间与像素格式)
const AVPixFmtDescriptor *pixdesc- = av_pix_fmt_desc_get(pix_fmt)
const AVComponentDescriptor *comp = &(pixdesc->comp[i]);
if (comp->step > max_pixsteps[comp->plane]) {
max_pixsteps[comp->plane] = comp->step;
if (max_pixstep_comps)
max_pixstep_comps[comp->plane] = i;
}