在 Linux 中使用 ffmpeg 的完整指南
简介:本详细指南展示了如何在 Ubuntu 和其他 Linux 发行版中安装 ffmpeg。它还演示了一些实用的 ffmpeg 命令以供实际使用。
ffmpeg 是一个用于处理媒体文件的 CLI(基于命令行)实用程序。它是一个具有多种功能的框架,并且由于它的开源许可证,它是许多广泛应用程序(例如 VLC、YouTube、iTunes 等)的基础。许多 Linux 视频编辑器在 GUI 下使用 ffmpeg。
我更喜欢 ffmpeg 的是,它可以单独使用,以非常简单的方式(使用一两个命令)完成许多处理任务。然而,它是一个非常强大的程序,可以以更复杂的方式使用,甚至可以取代编辑工作流程。
在本 ffmpeg 教程中,我将向您展示如何安装 ffmpeg 并介绍它的不同用途。我什至会介绍一些更复杂的功能。
以下是本指南的各个部分:
安装 ffmpeg
ffmpeg的基本用法
ffmpeg的高级使用
过滤器基础知识
我将详细解释所有内容,以便即使您是 Linux 世界的新手,您也可以了解正在发生的事情。
我将使用 Ubuntu 18.04,但这些命令也应该适用于其他发行版。
注意: 虽然我已经彻底研究了ffmpeg并测试了我在本文中提到的所有内容,但我不会在每日基础。如果您有任何建议、提示或更正,请在评论中告诉我!
让我们努力吧!
在 Ubuntu 和其他 Linux 上安装 ffmpeg
安装ffmpeg是一个简单的过程。它是一个流行的应用程序,可以通过包管理器在大多数 Linux 发行版中使用。
在 Ubuntu 中安装 ffmpeg
在 Ubuntu 中,ffmpeg 在 Universe 存储库中可用,因此请确保启用 Universe 存储库。然后更新软件包列表并安装 ffmpeg。您可以在终端中使用以下命令来完成所有这些操作:
sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg
应该是这样!您只需输入以下内容即可验证安装:
ffmpeg
这应该显示一些描述您的 ffmpeg 配置的文本(包括版本)。
从上面的屏幕截图中可以看到,安装的版本是3.4.4。不过,在撰写本文时,ffmpeg 的最新版本是4.1。要安装任何 4.x 版本,您必须使用 ffmpeg ppa。单击展开下一节,查看通过 PPA 安装 ffmpeg 的详细信息。
您可以使用非官方 PPA 来安装最新的 ffmpeg 版本。只需使用这些命令:
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
sudo apt install ffmpeg -y
在基于 Arch 的发行版中安装 ffmpeg
要在基于 Arch 的发行版中安装 ffmpeg,请使用以下命令:
sudo pacman -S ffmpeg
在基于 Fedora 的发行版中安装 ffmpeg
要在基于 Fedora 的 Linux 发行版中安装 ffmpeg,可以使用以下命令:
sudo dnf install ffmpeg
如何使用 ffmpeg:基础知识
安装ffmpeg后,我将介绍基本命令,以帮助您开始使用这个强大的工具。
0.ffmpeg命令
ffmpeg 命令的基本形式是:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
您必须记住,所有文件选项仅适用于它们后面的文件(您必须为下一个文件再次写入它们)。
任何前面没有 -i 的文件都被视为输出文件。 Ffmpeg 使用您提供的尽可能多的输入和输出。您还可以对输入和输出文件使用相同的名称,但必须在输出文件名之前添加 -y 标记。
笔记
您不应该混合输入和输出;先指定输入文件,然后指定输出文件。
1.获取媒体文件信息
ffmpeg 的第一个用途是显示有关媒体文件的信息。这可以通过不输入任何输出文件来完成。只需输入:
ffmpeg -i file_name
这适用于音频和视频文件:
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
虽然很有用,但此命令会显示太多与您的文件无关的信息(有关 ffmpeg 的信息)。要省略它,请添加 -hide_banner 标志:
ffmpeg -i video_file.mp4 -hide_banner
ffmpeg -i audio_file.mp3 -hide_banner
如您所见,该命令现在仅输出有关您指定的媒体文件(编码器、流等)的详细信息。
2. 转换媒体文件
使用ffmpeg的另一个非常有用的方法是在不同媒体格式之间进行无麻烦的转换。您只需指定输入和输出文件,因为 ffmpeg 将从文件扩展名中获取所需的格式。这适用于视频到视频和音频到音频的转换。
这里有些例子:
ffmpeg -i video_input.mp4 video_output.avi
ffmpeg -i video_input.webm video_output.flv
ffmpeg -i audio_input.mp3 audio_output.ogg
ffmpeg -i audio_input.wav audio_output.flac
您甚至可以指定更多输出文件:
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
这会将输入文件转换为所有指定的格式。
要查看所有支持的格式的列表,请使用:
ffmpeg -formats
同样,您可以添加 -hide_banner 以省略有关应用程序的信息。
您可以在输出文件之前指定 -qscale 0 参数以保持视频文件的质量:
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
此外,您可以指定要使用的编解码器,添加-c:a(用于音频)和-c:v<(对于视频),后跟编解码器的名称,或者如果您想使用与原始文件相同的编解码器,则复制:
ffmpeg -i video_input.mp4 -c:v copy -c:a libvorbis video_output.avi
注意: 这可能会使文件扩展名具有欺骗性,所以要小心。
3.从视频中提取音频
要从视频文件中提取音频,您可以进行简单的转换并添加 -vn 标志:
ffmpeg -i video.mp4 -vn audio.mp3
请注意,此命令将使用原始文件的比特率。最好自己设置;您可以使用-ab(音频比特率):
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
一些常见比特率为 96k、128k、192k、256k、320k(mp3 支持的最高比特率)。
其他常用选项有-ar(音频频率:22050、441000、48000)、-ac(音频数量) 音频通道)、-f(音频格式,尽管通常会自动检测到)。 -ab 也可以替换为 -b:a。例如:
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
4. 静音视频中的音频
与上一个任务类似,为了完成此任务,我们将添加一个简单的标签:-an(而不是-vn)。
ffmpeg -i video_input.mp4 -an -video_output.mp4
注意: -an 标记将使该输出文件的所有音频选项变得无用,因为操作结果中不会有音频。
5.从视频中提取图像
这对很多人来说可能会派上用场。例如,您可能有一系列图像(例如幻灯片),并且您希望从中获取所有图像。只需输入:
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
让我们把它拆开一下。
-r指定帧率(一秒提取多少帧成图像,默认:25),-f指定输出格式(image2实际上代表image2序列。
最后一个参数(输出文件)有一个有点有趣的命名:它在末尾使用 %3d 。这只是用 3 位数字(000、001 等)对图像进行编号。如果需要,您还可以使用%2d(2 位数字格式)甚至%4d(4 位数字格式)。请随意尝试并使用任何对您有用的东西!
注意: 还有一种方法可以将一组图像转换为视频/幻灯片。我将在高级用法部分中介绍这一点。
6.更改视频分辨率或宽高比
ffmpeg 的另一个简单任务。要调整视频大小,您只需在-s标志后指定新的分辨率即可:
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
此外,您可能需要指定 -c:a 以确保输出文件的音频编解码器是正确的:
ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
您还可以使用 -aspect 更改纵横比:
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
注意: 高级用法部分将再次提到另一种稍微强大的方法。
7. 将海报图像添加到音频中
这是使用单张照片(例如专辑封面)作为音频来将音频转换为视频的好方法。当您想要将音频文件上传到不允许视频/图像以外的任何内容的网站时,这是一个非常有用的功能(YouTube 和 Facebook 是此类网站的两个示例)。
这是一个例子:
ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
只需更改编解码器(-c:v指定视频编解码器,-c:a指定音频 编解码器)和文件的名称。
注意: 如果您使用的是较新版本 (4.x),则不必使用-严格实验。
8.为视频添加字幕
使用 ffmpeg 同样有用且简单的方法是向视频(例如电影)添加字幕。输入以下内容:
ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
当然,您可以指定所需的任何编解码器(以及与音频/视频相关的任何其他附加选项)。您可以阅读这篇有关在 Linux 中以图形方式编辑字幕的文章。
9. 压缩媒体文件
压缩文件可以大大减小文件大小,从而节省大量空间。这对于传输文件很重要。使用ffmpeg,有多种方法可以减小文件大小。
注意: 过度压缩文件会显着降低生成文件的质量。
首先,对于音频文件,只需降低比特率(使用-b:a或 >-ab):
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
同样,一些不同的比特率值是:96k、112k、128k、160k、192k、256k、320k。比特率越高,文件大小和质量就越高。
对于视频文件,您有更多选择。一种方法是降低视频比特率(使用-b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
注意: 视频比特率与音频比特率不同(值高得多)。
您可以设置-crf标志(恒定速率因子)。较低的 crf 意味着较高的比特率。此外,使用libx264作为视频编解码器也有帮助。这是一种非常有效的尺寸减小方法,但质量的降低非常小:
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
20 到 30 的 crf 很常见,但您可以随意调整具体值。
在某些情况下,降低帧速率可能会起作用(尽管它可能很容易使视频感觉缓慢):
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 指定帧速率(在本例中为24)。
您还可以尝试减小视频的大小(已经解释了如何做到这一点)。另一个技巧是压缩音频,使其立体声并降低比特率。例如:
ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
注意: -strict -2 和 -ac 2 负责立体声部分。我已经介绍了降低比特率的部分。
10.剪切媒体文件(基本)
要从开头开始修剪文件,您必须使用-t指定持续时间:
ffmpeg -i input_video.mp4 -t 5 output_video.mp4
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
如您所见,这适用于视频和音频文件。上面的两个命令都做同样的事情:将输入文件的前 5 秒保存到输出文件。我习惯了输入持续时间的不同方式:单个数字(秒数)和HH:MM:SS(小时、分钟、秒)。第二个版本更像是结束时间。
您可以更进一步,通过使用 -ss 指定开始时间,甚至使用 -to 指定结束时间 :
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
您可以在以下位置查看开始时间 (-ss HH:MM:SS)、持续时间 (-t 持续时间)秒、结束时间(-到 HH:MM:SS)和开始时间(-s 持续时间)以秒为单位(在持续时间秒后开始)。
所有这些都是有效的命令,您可以使用它们处理媒体文件的任何部分。
如何使用 ffmpeg:高级用法
我现在将介绍稍微更高级的功能(例如屏幕投射、使用设备等)。我们直接进入第一点吧!
1. 分割媒体文件
我已经介绍了修剪文件。要将文件分成多个部分,您所要做的就是指定多个修剪(指定开始时间,每个输出文件之前的结束时间或持续时间)。
观察这个例子:
ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4
语法非常简单。我指定 -t 00:00:30 作为第一部分的持续时间(第一部分将包含原始视频的前 30 秒)。接下来,我指定希望其余部分成为第二个视频的一部分(从最后一部分的末尾开始,00:00:30)。
您可以根据需要对多个零件进行此操作!尽情享受这个功能吧,因为它非常强大。请记住,它也适用于音频。
2. 连接媒体文件
ffmpeg 也可以执行相反的过程:将多个部分放在一起。
为此,您必须创建一个新的文本文件,并使用您喜欢的编辑器开始编辑它。
由于我喜欢使用终端,因此我将使用 touch 和 vim。你怎么称呼这个文件并不重要。我将调用我的 join.txt 并使用 touch 创建该文件:
touch videos_to_join.txt
现在,我将使用 vim 编辑它:
vim videos_to_join.txt
你可以使用任何你想要的工具(nano、gedit 等),这对我来说是最容易使用的。
在这里,输入您想要加入的所有文件的完整路径(它们将按照您在此处写入的顺序加入),每行一个。确保它们具有相同的扩展名(例如mp4)。这是我的:
/home/ubuntu/Desktop/video_1.mp4
/home/ubuntu/Desktop/video_2.mp4
/home/ubuntu/Desktop/video_3.mp4
保存您刚刚编辑的文件。此方法适用于任何音频或视频文件。
现在输入以下内容:
ffmpeg -f concat -i join.txt output.mp4
注意: 我的输出文件是output.mp4,但这是因为我所有的输入文件都有mp4扩展名。<
这应该将您在 join.txt 中记下的所有文件(或您为该文件命名的方式)加入到一个输出文件中。
3. 将图像加入视频
这就是您如何制作幻灯片或类似内容的方法。我还将向您展示如何添加音频。
我建议做的第一件事是确保您想要放在一起的照片位于同一目录中。我会将我的照片放在名为 my_photos 的目录中。建议图片的扩展名为.png 和.jpg。无论您选择哪一个,请确保所有图像具有相同的扩展名(否则,使用 ffmpeg 可能会产生意想不到的效果)。您可以简单地将.png 文件转换为.jpg,反之亦然(请参阅基本用法)。
我们转换的格式 (-f) 应该是image2pipe。对于输入,您必须提供连字符 (–)。 image2pipe 允许您执行的操作是 pipe(在终端中使用 |)命令的结果,例如 cat > 到 ffmpeg 中,而不是一一输入所有名称。这正是我要做的。为此,我们还必须提到我们希望视频编解码器被复制(-c:v copy)(正确使用图像):
cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv
如果您播放此文件,您可能会认为幻灯片中只添加了一些图片。实际上,您的所有图片都已添加,但 ffmpeg 会尽快循环播放它们。这意味着每张照片 1 帧; ffmpeg(默认情况下)运行速度约为23 fps。
要更改此设置,您必须指定所需的帧速率 (-framerate):
cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv
在我的示例中,我将帧速率设置为1,这意味着每个帧(也意味着每个图像)显示1秒。
要添加音频,例如背景歌曲,我们必须将音频文件指定为输入文件(-i audo_file )和复制音频编解码器(-c:副本)。对于编解码器,您可以使用-c copy同时复制音频和视频编解码器。确保在指定输出文件之前正确设置编解码器。您还可以设置帧速率,以便所有图片与您要使用的音频的持续时间同步。为此,请将图片数量除以音频持续时间(以秒为单位)。对于我的示例,我有一个 22 秒长的音频文件和 9 个图像。 9/22 大约为 0.40,所以这就是我将使用的帧速率:
cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
4. 录制屏幕
使用ffmpeg截屏并不是一件困难的工作。您需要使用的格式 (-f) 是x11grab。这将捕获您的XSERVER。作为输入,您必须指定屏幕显示编号(主屏幕通常应为0:0)。但是,这只会捕获屏幕的左上角部分。您应该添加屏幕尺寸 (-s)。我的是1920×1080。 屏幕尺寸应在输入之前提及:
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
随时按q或CTRL+C即可停止截屏视频。
额外技巧:您可以通过在大小之后输入此值来使输出文件的大小全屏(而不是1920×1080或任何其他设置分辨率):
-s $(xdpyinfo | grep dimensions | awk '{print $2;}')
这是完整的命令:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
5. 录制您的网络摄像头
从您的网络摄像头(或其他设备,例如 USB 摄像头)记录输入甚至更加容易。在 Linux 中,设备存储在 /dev 中,如 /dev/video0、/dev/video1 等:
ffmpeg -i /dev/video0 output.mkv
再次按q或CTRL+C停止录制。
6. 录制你的音频
Linux主要通过ALSA和pulseaudio来处理音频。 ffmpeg 可以记录两者,但我将介绍 pulseaudio,因为基于 Debian 的发行版默认包含它。这两种方法的语法略有不同。
对于pulseaudio,您必须强制(-f)alsa并指定默认作为输入(-i默认):
ffmpeg -f alsa -i default output.mp3
注意: 在您的分发声音设置中,确保默认录音设备是您想要录制的设备。
我经常弹吉他,我有一个音频接口,所以我可以录制它。当 ffmpeg 毫无问题地录制我的吉他时,我感到很惊喜。
关于录音的额外提示
当然,对于任何类型的录制,您还可以指定编解码器(已经介绍过)。您可以选择特定的帧速率 (-r)。您也可以将音频录制与网络摄像头/屏幕录制组合!
ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv
您可以轻松地添加音频文件作为录制在屏幕录像/网络摄像头上的输入,而不是录制音频:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4
注意:ffmpeg 以小片段进行记录,因此非常小的录音可能无法保存。我建议录制时间长一点,然后再剪切(如果您只需要几秒钟),以确保文件实际上会写入您的磁盘。
ffmpeg中Filter的基本用法
过滤器是ffmpeg的一个非常强大的功能。有大量的过滤器可供您使用,使ffmpeg完全能够处理任何编辑需求。由于过滤器非常多,而且本文已经很全面,因此我只介绍一些简单的过滤器。
使用过滤器的基本结构是:
ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav
如您所见,我指定了视频过滤器(-vf,-filter:v的缩写)和音频过滤器(-af,-filter:a 的缩写)。实际的过滤器写在双引号 (“)内,并且可以通过用逗号分隔它们来链接(, )。您可以根据需要指定任意数量的过滤器(我编写了 etc 来注明其他过滤器,它实际上不是命令的一部分)。
过滤器的一般形式是:
filter=setting_2=value_2:setting_2=value_2
不同的过滤器设置及其值由冒号分隔。
您还可以将数学运算作为不同设置的值来执行。
注意: 关于表达式中使用的不同常量和不同设置的更详细介绍可以在官方 ffmpeg 过滤器文档中找到ffmpeg 过滤器文档<.
我将介绍视频和音频过滤器。让我们看一些例子!
1. 视频缩放
这是一个非常简单的过滤器。唯一的设置是宽度和高度:
ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4
我提到过您也可以对值使用数学运算:
ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv
此命令将输出大小设置为输入大小的一半 (1/2) (in_w ,in_h)。
2. 视频裁剪
对于缩放过滤器,设置是结果文件的宽度和高度。或者,您可以指定剪辑的左上角坐标(默认:输入视频的中心):
ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv
如前所述,第二次剪切将在输入文件的中心进行剪切(因为我没有指定左上角的 x 和 y 坐标)。第一个命令将从左上角开始剪切 (x=0:y=0)。
以下是使用数学表达式作为值的示例:
ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv
此命令将输出大小设置为输入大小的3/4(in_w、in_h )。
3. 视频旋转
您还可以按值(以弧度为单位)顺时针旋转视频。为了使事情变得更简单,您可以指定一个以度为单位的值,并通过将该值乘以PI/180<将其转换为弧度 /强>:
ffmpeg -i input.avi -vf "rotate=90*PI/180"
ffmpeg -i input.mp4 -vf "rotate=PI"
第一个命令会将视频顺时针旋转 90 度。第二个命令将翻转视频上下颠倒(PI rad=180 度)。
4. 音频通道重新映射
如果您仅在右耳或类似设备中听到音频,这会很有帮助。您可以使双耳都能听到音频(在本例中),如下所示:
ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
这会将右 (1) 音频通道映射到左 (0) )和右 (1) 音频通道。 (左边的数字代表输入,右边的数字代表输出)。
5. 音频音量倍增
您可以将音量乘以任何实数(整数或非整数)。您只需指定乘数:
ffmpeg -i input.wav -af "volume=1.5" output.wav
ffmpeg -i input.ogg -af "volume=0.75" output.ogg
第一个命令将音量放大1.5倍。第二个命令使音频1/4 (0.25) 倍安静。
额外提示:播放速度调整
我将为此任务添加视频(不影响音频)和音频过滤器。
1.视频
视频的过滤器是setpts(PTS=演示时间戳)。这以一种有点有趣的方式工作。由于我们实际上修改了PTS,因此较大的系数意味着较慢的结果,反之亦然:
ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4
正如我刚才所解释的,第一个命令加倍播放速度,第二个命令减慢视频到 >速度的 1/2。A
2.音频
其过滤器是atempo。有一个小警告:它只能采用 0.5(速度的一半)和 2(速度的两倍)之间的值。为了解决这个问题,您可以链接 atempo 过滤器:
ffmpeg -i input.wav -af "atempo=0.75" output.wav
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3
第一个命令将音频减慢原始速度的1/4。第二个命令将音频加速4倍(2*2)。
注意: 要使用同一命令更改视频和音频播放速度,您必须查看过滤器图表。
总结
在这份综合指南中,我介绍了过滤器的安装、基本用法、高级用法和基础知识。
我希望这对于想要尝试ffmpeg的人以及想要使用ffmpeg进行多个任务,甚至只是为了那些愿意更熟悉这个令人惊叹的实用程序的广泛功能的人。
如果您觉得本文有用,请在下面的评论中告诉我们,并告诉我们您使用ffmpeg的目的!我们期待任何类型的补充。感谢您阅读我们的博客,并关注一篇涵盖更复杂过滤的文章。享受!