这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 3 篇:FFmpeg 比特率/帧率/文件大小。
—— 来自公众号“关键帧Keyframe”的分享
比特率和帧速率是视频的基本特征,它们的正确设置对整体视频质量至关重要。如果我们知道所有包含的媒体流的比特率和持续时间,我们可以计算输出文件的最终大小。由于在使用 FFmpeg 工具时对帧速率和比特率的理解很重要,因此本文对每个术语进行了简要介绍。
1、帧率(频率)的介绍
帧率是指视频文件中每秒编码的帧数(FPS 或 fps)。人眼需要至少约 15 fps 才能感知到连续运动。帧率也称为帧频,其单位是赫兹(Hz)。LCD 显示器通常具有 60 Hz 的频率。
帧率分为两种类型:隔行(FPS 编号后带 “i”)和逐行(FPS 编号后带 “p”)。
在电视中使用隔行帧率:
- NTSC 标准使用 60i fps,即每秒隔行扫描 60 次(30 帧)。
- PAL 和 SECAM 标准使用 50i fps,即每秒 50 隔行场,相当于 25 帧。24p、25p 和 30p 的逐行帧率常用于电影行业。高端 HDTV 产品采用较高的 50p/60p 帧率。
常见视频帧率如下表所示:
FPS i=隔行 p=逐行 | 描述 |
---|---|
24p 或 23.976 | 自 20 世纪 20 年代起,电影行业的标准帧率。所有电影均以此频率拍摄。当这些电影被转为 NTSC 电视广播时,帧率会降至 24×1000/1001=23.976,而对于 PAL/SECAM 电视,帧率则提升至 25 帧/秒。 |
25p | 电源频率为 50 赫兹的国家(PAL 和 SECAM 标准)的电影和电视的标准帧率。 |
30p | 常见的视频帧率,常用于数码相机和摄像机,也可用于 60 赫兹(NTSC)隔行场的电视广播。 |
50i | PAL 和 SECAM 电视的标准场率(隔行帧率)。 |
60i 或 59.94 | NTSC 电视的标准场频率。彩色电视发明后,帧率降低至 60×1000/1001=59.94,以避免色度副载波与声音载波之间的干扰。 |
50p/60p | HDTV(高清晰度电视)的通用帧率。 |
48p | 当前正在测试的提议帧率。 |
72p | 当前正在测试的提议帧率。 |
120p | 为 UHDTV(超高清电视)标准化的逐行格式,计划将其作为 UHDTV 的全球统一“双频”帧率(而非 PAL 标准的 100 赫兹和 NTSC 标准的 119.88 赫兹)。 |
2、帧率设置
要设置视频帧率,需在输出文件前使用 -r 选项,语法如下:
ffmpeg -i input -r fps output
例如,将电影文件的帧率从 25 fps 更改为 30 fps,可使用以下命令:
ffmpeg -i input.avi -r 30 output.mp4
3、使用 fps 过滤器
另一种设置帧速率的方法是使用 fps 过滤器,在过滤链中特别有用。
描述 | 将视频帧速率更改为指定值。 |
---|---|
语法 | fps=fps=number_of_frames |
fps | 指定输出帧速率的数字或预定义缩写。 |
例如,将 .mpg 文件的输入帧速率更改为 25,可使用以下命令:
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
4、预定义的帧速率值
除了数值外,两种设置帧率的方法都接受以下预定义的文本值:
帧速率的预定义缩写:
缩写 | 精确值 | 对应的 FPS(每秒帧数) |
---|---|---|
ntsc-film | 24000/1001 | 23.97 |
film | 24/1 | 24 |
pal, qpal, spal | 25/1 | 25 |
ntsc, qntsc, sntsc | 30000/1001 | 29.97 |
例如,将帧率设置为 29.97 fps,以下三个命令可达到相同结果:
ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r ntsc output.mpg
5、比特率介绍
比特率(也称为比特率或数据率)是决定音频或视频整体质量的参数。它规定了每单位时间处理的位数。在 FFmpeg 中,比特率以每秒位数表示。
比特率类型:
类型 | 缩写 | 描述 |
---|---|---|
平均比特率 | ABR | 每秒平均处理的位数。该值也用于 VBR 编码,并在需要特定输出文件大小时使用。 |
恒定比特率 | CBR | 每秒处理的比特数恒定。由于快速运动的场景比静态场景需要更多比特,因此 CBR 不适合存储用途。CBR 主要用于多媒体流。 |
可变比特率 | VBR | 每秒处理的比特数可变。与 CBR 相比,复杂场景或声音会被编码更多数据,因此相同大小的文件具有更好的质量(VBR 编码比 CBR 需要更多时间和 CPU 资源,但现代媒体播放器可以充分解码 VBR)。 |
6、设置比特率
比特率决定了存储 1 秒编码流所需的位数,使用 -b 选项设置,并建议使用 -b:a 或 -b:v 来区分音频和视频流。例如,要设置总体比特率为 1.5 Mbit/s,可以使用以下命令:
ffmpeg -i film.avi -b 1.5M film.mp4
如果可能,ffmpeg 会使用可变比特率(VBR),并对静态部分进行较少比特编码,而对快速运动的场景进行更多比特编码。通常,ffmpeg 使用高级编解码器来降低输出文件的比特率和相应文件大小,例如:
ffmpeg -i input.avi -b:v 1500k output.mp4
7、设置恒定比特率(CBR)
对于视频会议等实时视频流,由于传输的数据不能缓冲,因此可以使用恒定比特率。要设置恒定输出比特率,三个参数必须具有相同值:比特率(-b 选项)、最小速率(-minrate)和最大速率(-maxrate)。可以在 minrate 和 maxrate 选项后添加流指示符,并且 maxrate 选项需要设置一个 -bufsize 选项(比特率控制缓冲区大小)。例如,要设置 0.5 Mbit/s 的 CBR,可以使用以下命令:
ffmpeg -i in.avi -b 0.5M -minrate 0.5M -maxrate 0.5M -bufsize 1M out.mkv
8、设置输出文件的最大尺寸
为了限制输出文件的大小,我们使用 -fs 选项(文件大小的缩写),期望值以字节为单位。例如,要指定 10 兆字节的最大输出文件大小,可以使用以下命令:
ffmpeg -i input.avi -fs 10MB output.mp4
9、文件大小计算
编码输出的最终文件大小是音频和视频流大小的总和。以字节为单位的视频流大小计算公式为(比特转换为字节需除以 8):
video_size = video_bitrate * time_in_seconds / 8
如果音频未压缩,其大小计算公式为:
audio_size = sampling_rate * bit_depth * channels * time_in_seconds / 8
要计算压缩音频流的文件大小,需要知道其比特率并使用以下公式:
audio_size = bitrate * time_in_seconds / 8
例如,使用 1500 kbits/s 的视频比特率和 128 kbits/s 的音频比特率计算 10 分钟视频剪辑的最终大小,可以使用以下公式:
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
- 1 字节(B)= 8 比特(b)
- 1 千字节(kB 或 KB)= 1024 B
- 1 兆字节(MB)= 1024 KB,依此类推。
实际文件大小可能比计算值略大,因为包含复用开销和文件元数据。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。