FFMPEG视频编码的基础知识

抛砖引玉

首先我们先计算以下 1080P 60fps 的视频文件大小:

假设是RGB每色8位(也就是一个像素24位)

一帧画面像素数量:1920 * 1080  ~ 200万

一个像素: 3 字节

一帧画面 :  1920 * 1080 * 24(位像素)/8(1字节8位)/1024(1KB=1024B)/1024(1MB=1024KB)~ 5.9MB

一秒视频:    5.9MB * 60 = 355MB

通过上面可知一秒钟的视频应该是355MB,但实际我们看的视频并没有这么大,那是因为我们看的视频都是进行压缩之后的,实际大小只有1~2MB,那到底是如何实现的呢,我们后面慢慢讲解。

分辨率

就如上面所说,1080p是什么?下面这些又是什么?

 HD:1280x720

FullHD:1920x1080

2k:2560x1440

上面这些我们日常生活中应该都听过或者看到过,那这些都是什么?没错,这就是分辨率。

分辨率 = 横向像素*纵向像素。

我们经常会看见或听别人说 1920x1080 ,那么 1920x1080 就是分辨率,也就是横向1920个像素*纵向1080个像素。

是不是感觉很简单,那么下面一个问题,1080p是什么?你也许会说应该是 1920x1080的缩写吧,那么 1080i又是什么?看到这里是不是已经懵逼了,其实很简单

  • p:代表逐行扫描(Progressive Scanning)
  • i:代表隔行扫描(Interlace Scanning)

逐行扫描就是一行行扫描生成图像,一帧就是一个图像。

隔行扫描会将视频按照奇数扫描前一帧,然后再按照偶数扫描后一帧,最后将其合并就是一个完整的画面了。

隔行扫描相对于逐行扫描带宽会节省一半,也就是说同样的带宽可以获得更好的清晰度。

帧率

上面所说的 60fps 是什么?没错他就是帧率。

视频格式

封装格式

什么是封装格式?

他是一种容器,它规定了视频的外在,存储视频、音频、媒体信息及字母信息等,例如我们平时看见的 mp4mkvmov 这些就是封装格式。

编码格式

什么是编码格式?h264h265这些就是编码格式。常见的编码格式

 
  

MP4:H.264,H.265, MPEG4.. WebM VP8VP9... AVI:MPEG-2, AC-1, H.264, DIVX,XVID... RM/RMVB: RV, RM... MOV:MPEG-2, XVID, H.264... TSIPS:MPEG-2,H.264, MPEG-4.. WMy:WMV,AC-1.. MKV:可封装所有的视频编码格式

码率

平时转码视频时经常能看见 -b:v 5000Kbps,那么它究竟是什么呢?没错它就是视频码率(bitrate),音频码率使用 -a:v表示

码率:视频每一秒包含的数据量、信息量。码率直接决定了视频的最终大小及视频的质量。

控制码率的方法

CBR:固定码率,全程码率恒定,文件大小可预期,编码压力小,直播常用;简单场景画质好,复杂场景画质差;属于空间利用率最低的一种方法。

VBR:可变码率 ,码率可变,按需分配,简单场景码率低,复杂场景码率高。

CRF: 固定质量,固定质量模式 CRF值越低,视频看起来质量越高,反之亦然,以观感画质为目标码率、文件大小不可预期。

视频压缩

最开始我们说了,如果视频不压缩那么视频的体积就会特别大,无论是存储或者传输都会特别占用空间,那么通过视频压缩就是将原视频压缩至我们可以正常观看的视频大小了。但是视频压缩也会分为帧内压缩及帧间压缩。

帧内压缩(Intraframe compression)

帧内压缩:将视频的每一帧画面都压缩成JPEG这类有损图像,原理就是尽可能保存视频亮度信息,压缩颜色信息尤其是复杂的颜色信息,通俗来讲就是记录关键帧,剩余的依靠运动轨迹来预测生成视频。可以节省90%的空间。

帧内压缩就是压缩 GOP 图像组中的 I 帧。

帧间压缩(Interframe compression)

帧间压缩(Interframe compression)也称为时间压缩(Temporal_compression),是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现的;通过比较时间轴上不同帧之间的数据实施压缩,进一步提高压缩比。

帧内压缩就是压缩 GOP 图像组中的 B 帧与 P 帧。

GOP(Group Of Picture)

画面组,每一组IPB顺的序列包含多少顿,即一个I帧之后要经过多少帧会出现下一个帧。

同码率下,GOP值越大代表模拟出的P、B帧越多,那么视频就越清晰,画面质量就越高。

I帧

关键帧。不参考其他图像帧,只利用本帧的信息进行编码

P帧

预测帧,表示跟前一帧的差别,在I帧的基础上预测得出,比I帧节省一半的空间。利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码。

B帧

双向预测帧,表示前后帧差别,在 I帧P帧的基础上再次进行预测。比 P帧又节省了一半的空间,提供最高的压缩比,它既需要之前的图 像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码

h264编码方式

我们常见的mp4就是h264编码的。

Preset(预设)
  • Faster 超低
  • Fast 低
  • Medium 中
  • Slow 高
  • Very Slow 超高

cpu编码及GPU编码

使用cpu编码的视频质量要高于GPU的视频质量,但是速度想读与GPU要慢很多。

示例和方法

码率和视频体积之间的关系

视频和音频码率计算公式:

  • 视频码率计算公式(kbps,千位每秒) = 文件大小(KB,千字节)* 8 / 秒数
  • 音频码率计算公式(kbps,千位每秒) = 采样率 × 采样位深 × 通道数

比特率又叫码率,比特率全称是bit,单位是b,用来表示每秒初始的字节数,单位是 kbps (注意是小写的 k )

  • K 字节数
  • b 比特(bit)
  • p 每(per)
  • s 秒(secend)

一般用Kbps表示(即千位比特率,K=千位,b=比特率,p=per每,s=second秒,意思就是:每秒传送多少千位比特率)

比特率和字节之间的计算公式,可以通俗的把比特率理解为代表速度,字节代表体积,一字节有8位比特率,字节全称是Byte,单位是B,即1B=8b。

举个例子:现在我有一个音视频文件,时长4分钟,码率是512Kbps,求这个文件的体积,公式:4*60*(512÷8)=15360KB(这个音视频文件有15MB),为什么512要÷8,因为8个码率是1个字节,我们是求体积所以需要÷。

比特率又一个粗略的计算公式: 文件大小/时长

比如一个文件大为 12MB,时长为 88秒,那么按照粗略计算公式,比特率大概为:

(12 * 1024 * 8) / 88 =  1117.09 kbps

 

计算文件Size

计算视频流Size的公式如下所示:

//码率*时间/8得出来的时间单位是bytes
video_size = video_bitrate * time_in_second / 8

计算音频流Size的公式如下所示:

//如果音频没有经过压缩计算公式如下
audio_size = sampling_rate * bit_depth * channels * time_in_seconds/8;

//如果音频流经过压缩了计算公式如下
audio_size = bitrate * time_in_seconds / 8

下面以一个时长为10分钟,视频码率为1400k/s音频码率为128k的视频文件为例说明一下计算公式的使用方法

//1byte = 8bits
file_size = video_size + audio_size
file_size = (video_bitrate + audio_bitrate) * time_in_seconds / 8
file_size = (1500 kbit/s + 128 kbits/s) * 600 s
file_size = 1628 kbit/s * 600 s
file_size = 976800 kb = 976800000 b / 8 = 122100000 B / 1024 = 119238.28125 KB
file_size = 119238.28125 KB / 1024 = 116.443634033203125 MB ≈ 116.44 MB

实际的文件大小可能要比计算的文件大小大一些,因为其中包含了一些打包数据和视频文件的元数据。

你可能感兴趣的:(ffmpeg,音视频)