小艾的自留地

Stay foolish, Stay hungry

FFMpeg 是一个强大的命令行音视频工具,可以承担转码、混流、嵌挂字幕、剪辑等工作。

FFMpeg 最常用的是他的命令行工具,通过一行简单的命令,即可将一个 mp4 格式的视频转换成 avi格式。

1
$ ffmpeg -i input.mp4 output.avi

这篇笔记介绍一些基本概念,如果还没安装,可以根据官方文档先完成安装。

基本概念

在介绍 FFmpeg 的工作命令之前,我们首先对视频文件内部的一些概念做一个通俗的说明。

容器

视频文件本身其实是一个容器,里面包括了视频流和音频流,也可能有字幕流(有的视频将字幕流嵌入到了视频流中(内嵌字幕),这类视频没有字幕流)。

常见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。

  • MP4
  • MKV
  • WebM
  • AVI

编码格式

视频和音频都需要经过编码,才能保存成文件。不同的编码格式(CODEC),有不同的压缩率,会导致文件大小和清晰度的差异。

先来了解一下编码和解码的概念:

  • 编码:将视频流/音频流用某种格式或规范记录下来并存储,称为编码;
  • 解码:将编码后的流,根据格式或规范来逆向实现编码的过程,从而将流还原出来,称为解码

FFmpeg 支持基本所有的主流编码格式。

常见的视频编码格式有:

  • H.264 是上一代最广为使用的视频编码格式,始于 2003 年,当之无愧的一代霸主。在 FFmpeg 中可由 libx264 编码器支持。
  • H.265/HEVC 是 H.264 的接任者,于 2013 年正式面世。它在同等视频质量下提供了相比 H.264 而言可达 50% 的体积缩减。 libx265 编码器对该编码格式提供了支持。

常用的音频编码格式有:

  • MP3 时至今日仍最流行的有损编码格式。编码器 libmp3lame。
  • AAC 是 MP3 的接任者,常常作为视频容器 MKV 选用的音频格式,而其作为音频时的容器则通常是是 m4a。编码器有 FFmpeg 原生提供的、针对低码率音频(AAC LC)的 aac 编码器;此外,需要制作高质量 AAC 时(HE-AAC)可以使用 libfdk_aac 编码器。
  • AC3 杜比数字格式,编码器 ac3 (Dolby Digital) 或者 eac3 (Dolby Digital Plus)。
  • FLAC 是较常用的无损音频格式;FFmpeg 对其有原生的编码器 flac 支持。
  • PCM 是 WAV 容器内包含的最常见音频编码格式。FFmpeg 默认使用 pcm_s16le 编码器来处理 PCM 输出。

视频概念

对于视频而言,以下参数会对视频质量和文件大小有直接影响:

  • 视频编解码器(Codec):视频编解码器决定了对视频信号进行压缩和解压缩的算法。不同的编解码器具有不同的压缩效率和处理能力,对视频质量和文件大小有直接影响。常见的视频编解码器包括H.264(AVC)、H.265(HEVC)、VP9等。
  • 比特率(Bitrate):比特率是指视频每秒的数据传输速率,通常以bps(每秒比特数)或Mbps(兆比特每秒)为单位。较高的比特率可以提供更高的视频质量,但会增加文件大小。较低的比特率可能导致视频质量下降和压缩伪影的出现。
  • 分辨率(Resolution):分辨率表示视频图像的清晰度和像素数量,通常以宽度×高度的形式表示,如1920×1080(1080p)或3840×2160(4K)。较高的分辨率可以提供更清晰的图像,但也会增加文件大小。
  • 帧率(Frame Rate):帧率表示视频每秒播放的帧数,通常以fps(帧每秒)为单位。较高的帧率可以提供更流畅的视频,但会增加文件大小。常见的帧率有24fps、30fps和60fps。
  • 关键帧间隔(Keyframe Interval):关键帧间隔指定视频序列中关键帧(I帧)之间的间隔,关键帧是完整编码的帧,其他帧(P帧和B帧)是相对于关键帧进行差异编码。较短的关键帧间隔可以提高视频编辑和随机访问的效率,但会增加文件大小。
  • 编码参数(Encoding Parameters):针对特定的视频编码器,可能存在一些特定的参数可以调整,如量化参数、编码预设、编码选项等。这些参数的具体设置可以对视频质量和文件大小产生影响

音频概念

对于音频而言,以下参数会对音频质量和文件大小有直接影响:

  • 比特率(Bitrate):比特率是指音频每秒的数据传输速率,通常以kbps(千比特每秒)为单位。较高的比特率可以提供更好的音质,但会增加文件大小。较低的比特率可以减小文件大小,但可能导致音质损失。
  • 采样率(Sample Rate):采样率是指在一秒钟内对音频信号进行采样的次数,通常以Hz为单位。较高的采样率可以提供更好的音频质量,但会增加文件大小。较低的采样率可能导致高频信号损失和音质下降。
  • 声道数(Channels):声道数表示音频中的独立声道数量,常见的有单声道(Mono)和立体声(Stereo)。立体声可以提供更丰富的音频表现,但会增加文件大小。
  • 编码格式(Codec):音频编码格式决定了对音频信号进行压缩和解压缩的算法。不同的编码格式对音质和文件大小有不同的影响。一些常见的音频编码格式包括MP3、AAC、Opus等。
  • 压缩级别(Compression Level):某些音频编码格式允许设置压缩级别,通常以质量因子或压缩比为单位。较高的压缩级别会导致更高的压缩率和更小的文件大小,但可能会损失音频质量。
  • 音频格式参数(Format Parameters):针对特定的音频格式,可能存在一些特定的参数可以调整,如位深度(Bit Depth)、编码器选项等。这些参数的具体设置可能会对音质和文件大小产生影响。

常见用法

查看文件信息

查看视频/音频文件的元信息,比如编码格式和比特率,可以只使用-i参数:

1
$ ffmpeg -i input.mp3

上面命令会输出很多冗余信息,加上-hide_banner参数,可以只显示元信息:

1
$ ffmpeg -i input.mp3 -hide_banner

改变音频采样率和比特率

1
$ ffmpeg -i input.mp3 -ar 44100 -b:a 128k output.mp3
  • -ar 44100: 指定音频采样率为 44100 Hz,这是每秒采样的音频样本数量
  • -b:a 128k: 指定音频比特率为 128 kbps,这是音频的数据传输速率
  • output.mp3: 指定输出文件名为 output.mp3,这是转码后生成的目标音频文件

将 WAV 文件转换为 MP3 文件

1
$ ffmpeg -i input.wav -codec:a libmp3lame -q:a 4 output.mp3
  • -codec:a libmp3lame: 指定音频编解码器为 libmp3lame,这是用于将音频编码为 MP3 格式的编解码器。
  • -q:a 4: 指定音频质量,取值范围为 0-9,其中 0 为最高质量,9 为最低质量(默认为 4)。
  • output.mp3: 指定输出文件名为 output.mp3,这是转码后生成的目标音频文件。

为音频添加封面

1
$ ffmpeg -loop 1 -i cover.jpg -i input.mp3  -shortest output.mp3
  • -i cover.jpg:表示输入封面图片 cover.jpg,另一个则是音频文件
  • -loop 1参数表示图片无限循环

评论