控制比特率

可以通过设置比特率来压缩视频。比特率是决定视频文件大小的主要因素之一。以下命令将视频比特率设置为 1000k:

ffmpeg -i input.mp4 -b:v 1000k output.mp4

这个命令会以 1000k 的比特率重新编码视频,压缩后的视频质量可能会略有下降,但文件大小会减小。

使用 CRF(Constant Rate Factor)模式

CRF 是 FFmpeg 中一种在质量和文件大小之间取得平衡的模式。CRF 值的范围为 0-51,数值越低,质量越高,文件越大。通常,23 是默认值,18-23 被认为是较好的平衡点。你可以使用以下命令来压缩视频:

ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4

这个命令使用 libx264 编码器,并通过设置 -crf 值来压缩视频,同时保持较好的视频质量。

调整分辨率:

如果允许降低分辨率,你可以使用 -vf 参数调整视频的分辨率,从而进一步减小文件大小:

ffmpeg -i input.mp4 -vf "scale=1280:720" -crf 23 output.mp4

这个命令将视频的分辨率调整为 1280x720,并使用 CRF 23 进行压缩。

音频压缩:

除了视频压缩外,调整音频比特率也能有效减少文件大小。以下命令将音频比特率设置为 128k:

ffmpeg -i input.mp4 -b:a 128k output.mp4

可以结合视频和音频的设置一起使用:

ffmpeg -i input.mp4 -vcodec libx264 -crf 23 -b:a 128k output.mp4

不降低视频质量的压缩

在不明显降低视频质量的情况下,使用 CRF 模式并控制在适当的范围(如 18-23)是一个较为通用的做法。此外,调整音频比特率并确保分辨率符合需求,也能在不牺牲太多质量的前提下有效压缩文件大小。

ffmpeg -i inputfile [options] outputfile
  • -i inputfile:指定输入文件。
  • [options]:用于设置输出的选项,如编码格式、比特率等。
  • outputfile:指定输出文件的路径和名称。

查看文件信息

使用以下命令可以查看视频文件的详细信息,如编码格式、分辨率、比特率等:

ffmpeg -i input.mp4
  • 帧率的单位是:FPS 是指每秒帧数(Frames Per Second)简写:P,“如 30 fps 和 30 p 指的都是每秒钟播放 30 张图片的意思” 。
  • 高低帧率:低帧率会伴随模糊、卡顿、镜头移动时不顺畅等问题,但也不是越高越好,会造成眩晕的感觉。
  • 不同帧率的视频在不同设备上播放: ① 若一个播放设备最高支持 60fps,在此设备上播放 120fps 的影片,则播放设备会每隔一张删除 120fps 的影片,被删除的图片成为无效帧。 这就导致高帧率的影片在低帧率的设备上播放时,会降低播放流畅度。 ② 若一个播放设备最高支持 120fps,在此设备上播放 60fps 的影片,则播放设备会每将每张图片复制一张,以填补空缺的帧。但是效果和 60fps 的设备上播放一样,对播放流畅度没有提升。

帧率是直接影响流畅度的指标,视频一般 24FPS/25FPS 已经足够,低于 24 将会感到卡顿。

非常非常重要的一个参数。

码率就是数据传输时单位时间(1s)传送的数据位数,一般我们用的单位是 kbps 即千位每秒。

码率与体积的关系:

  • 在相同的时间下,码率越大,体积就越大。
  • *存储体积 = 码率 时间。**

码率与画质的关系:

  • 同样分辨率下,视频文件的码率越大,压缩比就越小,画面质量就越高。码率越高,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

  • 编码模式 码率取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来 cbr(固定码率)、vbr(可变码率)、abr(平均码率);

CBR: constant bitrate(固定码率)

  • 以恒定比特率方式进行编码,有运动发生时,由于码率恒定,只能通过增大 QP 来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。

  • 这种算法优先考虑码率(带宽)。适合在流式播放中应用。

  • CBR 编码的缺点在于编码内容的质量不稳定,容易产生马赛克。因为对于某些较复杂的图像比较难压缩,所以 CBR 流的某些部分质量就比其他部分差。

VBR:variable bitrate(动态码率)

  • 比特分配根据图像内容的复杂度进行。如果图像细节较丰富或者含有大量的运动,则给其分配大一点的码流,若图像比较平坦,就给其分配较少的码流, 这样既保证了质量,又兼顾带宽限制。

  • 这种算法适合图像内容变化幅度较大的情况;

  • 适合的应用场景是媒体存储,不适合网络传输;

QVBR(Quality Variable Bit rate)质量码流

  • QVBR 在 VBR 的基础上,增加了自适应动态质量控制功能。编码器会根据图像质量目标和帧率等因素自适应调节码率,以确保图像质量。这种编码方式减少了码率的小部分波动对图像质量的影响,进一步提高了图像的清晰度和稳定性。

  • 优点:能够在保证画面质量的前提下减少码流的波动

  • 缺点:相比 VBR 需要更高的码率带宽比。

ABR:average bitrate(平均码率,是 VBR 的一种插值参数)

  • 是在 CBR 和 VBR 两者之间的一种权衡,即设定一段时间的平均码率,在此时间内,对简单,静态的图像分配低于平均码率的码率,对于复杂的,大量运动的图像分配高于平均码率的码流;

  • 适合网络传输;

CVBR:Constrained VariableBit Rate(有限码流)

  • 是 VBR 的一种改进方法,对应的 Maximum bitRate 恒定或者 Average BitRate 恒定。兼顾了 CBR 和 VBR 的优点:在图像内容静止时,节省带宽,有运动发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。

基本命令

查看 FFmpeg 版本

ffmpeg -version

查看支持的编解码器

ffmpeg -codecs

查看支持的格式

ffmpeg -formats

获取输入文件信息

ffmpeg -i input.mov

格式转换

将 MOV 转换为 MP4

ffmpeg -i input.mov output.mp4

将 AVI 转换为 MP4

ffmpeg -i input.avi output.mp4

将音频文件转换为 MP3

ffmpeg -i input.wav output.mp3

视频压缩

FFmpeg 可以通过调整比特率、分辨率和编码器等方式压缩视频。以下是一些压缩视频的常用方法:

通过设置比特率压缩视频

ffmpeg -i input.mp4 -b:v 1000k output.mp4

-b:v 选项设置视频的比特率(此处为 1000 kbps)。

通过设置视频质量压缩视频(使用 CRF 参数)

ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp4

-crf 参数用于控制质量(值越小,质量越高,文件越大;值越大,质量越低,文件越小)。通常范围是 18 到 28。

通过调整分辨率压缩视频

ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4

-vf scale=width:height 选项用于设置输出视频的分辨率。

提取音频

从视频中提取音频

ffmpeg -i input.mp4 -vn -acodec copy output.aac

-vn 选项表示不包括视频流。

从视频中提取音频并转换为 MP3

ffmpeg -i input.mp4 -q:a 0 -map a output.mp3

-q:a 0 选项表示高质量音频(VBR)。

裁剪视频

裁剪视频的前 30 秒

ffmpeg -i input.mp4 -ss 00:00:00 -t 00:00:30 -c copy output.mp4

-ss 选项表示开始时间,-t 选项表示持续时间。

从视频的第 10 秒开始截取到结束

ffmpeg -i input.mp4 -ss 00:00:10 -c copy output.mp4

合并视频

合并多个视频文件

首先,创建一个包含所有视频文件路径的文本文件(如 filelist.txt),内容格式如下:

file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

使用 FFmpeg 进行合并:

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

视频转码

使用 H.264 编码器进行转码

ffmpeg -i input.mp4 -vcodec libx264 -preset fast -crf 23 -acodec aac -b:a 128k output.mp4

-preset 选项控制编码速度和压缩比,常用值包括 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。

其他有用的命令

显示输入视频的帧数、帧率、时长等信息

ffprobe -v error -show_entries format=duration:stream=avg_frame_rate:frame=pkt_pts_time input.mp4

提取视频帧

ffmpeg -i input.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -q:v 2 frames_%04d.jpg

上面的命令将提取所有关键帧(I 帧)并保存为图像文件

https://github.com/BtbN/FFmpeg-Builds/releases

添加 FFmpeg 到系统路径

  • 打开“系统属性” -> “高级系统设置” -> “环境变量”。
  • 在“系统变量”中找到“Path”,并点击“编辑”。
  • 添加 FFmpeg 的 bin 目录路径。

MOV 转换为 MP4 格式

ffmpeg -i input.mov output.mp4

其他选项

FFmpeg 提供了许多选项来控制视频和音频的编码参数。例如,你可以指定视频编码器、音频编码器、比特率等。

ffmpeg -i input.mov -c:v libx264 -c:a aac -b:v 1000k -b:a 128k output.mp4
  • -c:v libx264:使用 H.264 视频编码器。
  • -c:a aac:使用 AAC 音频编码器。
  • -b:v 1000k:设置视频比特率为 1000 kbps。
  • -b:a 128k:设置音频比特率为 128 kbps。