FFmpeg基础:音视频中的那些核心参数


码率和帧率是视频文件的关键指标参数,这些参数决定了一个视频文件的质量。如果我们知道了一个视频文件中所有流的码率我们就可以计算出这个视频文件的大小了。深刻理解码率和帧率概念对于使用ffmpeg进行音视频开发是很有帮助的,这里就详细介绍一下这几个概念。

帧率

帧率就是视频每秒播放的图片的帧数。帧率至少要达到15fps,人眼才能才能看到连贯的动作。15fps(frame per second)有时候也被称为15HZ,即1秒刷新15次。帧率主要分为两类,一种是交错的(interlaced 缩写为i),一种是步进的(progressive 缩写为p)。

交错帧率一般应用在电视节目上。NTSC(美国电视标准)使用60i的帧率,也就是每秒60个交错场(也就是30帧,两个交错场就是一帧)。PAL和SECAM标准使用50i的帧率,也就是每秒25帧。

步进帧率通常使用在电影节目上,常使用的值包括24p、25p、30p。最近一些高清的电影电视终端节目上30p已经无法满足需求,最新使用的帧率通常为50p和60p。

常见帧率的使用场景说明如下表所示:

帧率
(interlaced 缩写为i)
(progressive 缩写为p)
描述
24p/23.976p 电影行业从1920年引入的标准帧率,在早期电影节目上使用的比较频繁。 NTSC采用该帧率的时候将帧率降到了23.976,PAL/SECAM采用该帧率的时候将帧率升到了25fps
25p 使用50HZ电子频率国家中的电视电影节目的标准帧率,因为25p的帧率很容易转换成50i的帧率
30p 数码相机和摄像机的帧率,30p的帧率很容易转换成60i用于电视直播
50i PAL和SECAM电视标准的标准帧率
60i/59.94 NTSC标准中的标准帧率
50p/60p 高清电视(HDTV)常用的帧率
48p 新提出的帧率,还在测试当中
72p 新提出的帧率 还在测试当中
120p 超高清电视节目(UHDTV)使用的帧率

修改帧率

使用ffmpeg工具修改视频文件的帧率命令如下所示:

ffmpeg -i input -r fps output

除了使用ffmpeg工具之外我们还可以使用ffmpeg的滤镜来修改视频文件的帧率
ffmpeg的fps滤镜可以用来修改视频文件的帧率,调用格式如下:

fps=fps=number_of_frames

使用ffmpeg工具调用滤镜修改视频文件的帧率指令如下所示:

ffmpeg -i input.mp4 -vf fps=fps=25 output.mp4

码率

码率代表着音视频文件单位时间的字节数量,决定了音视频的质量。码率的类型主要分为三类ABR、CBR、VBR,对应的介绍如下所示:

类型 缩写 介绍
Average bit rate ABR 平均码率,对于动态码率的编码文件可以通过平均码率来确定视频文件的大小
Constant bit rate CBR 固定码率,每秒处理的字节数固定。这个类型并不实用。因为动态场景肯定要比静态场景码率大,CBR常用于多媒体流传输
Variable bit rate VBR 每秒处理的位数是可变的,复杂的场景或声音用更多数据编码,与CBR相比相同大小的VBR质量比CBR好,但需要耗费更多的CPU

修改码率

使用ffmpeg提供的工具修改码率的指令如下:

//将码率修改为1.5M
ffmpeg -i input.avi -b 1.5M output.mp4

//只将视频流的码率修改为1.5M,音频修改为128k
ffmpe -i input.avi -b:v 1.5M -b:a 128k  output.mp4

计算文件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

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

猜你喜欢

转载自blog.csdn.net/yang1fei2/article/details/128779465