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参数表示图片无限循环