探索 FFmpeg Basics 音视频技术(3):比特率/帧率/文件大小

这个系列文章我们来介绍一位海外工程师如何探索 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)隔行场的电视广播。
50iPAL 和 SECAM 电视的标准场率(隔行帧率)。
60i 或 59.94NTSC 电视的标准场频率。彩色电视发明后,帧率降低至 60×1000/1001=59.94,以避免色度副载波与声音载波之间的干扰。
50p/60pHDTV(高清晰度电视)的通用帧率。
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-film24000/100123.97
film24/124
pal, qpal, spal25/125
ntsc, qntsc, sntsc30000/100129.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,依此类推。

实际文件大小可能比计算值略大,因为包含复用开销和文件元数据。

音视频方向学习、求职,欢迎加入我们的星球

丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

探索 FFmpeg Basics 音视频技术(3):比特率/帧率/文件大小

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

(0)

相关推荐

发表回复

登录后才能评论