在Linux中使用ffmpeg的完整指南

时间:2020-01-09 10:34:21  来源:igfitidea点击:

如何在Ubuntu和其他Linux发行版中安装ffmpeg。它还演示了一些实用的ffmpeg命令。

ffmpeg是用于处理媒体文件的CLI(基于命令行)实用程序。它是一个具有多种功能的框架,并且由于具有开源许可,因此它是许多广泛应用(例如VLC,YouTube,iTunes等)的基础。许多Linux视频编辑器在GUI下方使用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配置(包括版本)的文本。

ffmpeg vversion

从上面的屏幕截图中可以看到,安装的版本是3.4.4. 但是,在撰写本文时,ffmpeg的最新版本是4.1. 要安装任何4.x版本,我们必须使用ffmpeg ppa。单击以展开下一部分,以查看通过PPA安装ffmpeg的详细信息。

使用PPA在基于Ubuntu的发行版中安装最新的ffmpeeg

我们可以使用非官方的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显示有关媒体文件的信息

尽管有用,但此命令将显示太多与文件不相关的信息(有关ffmpeg的信息)。要忽略这一点,请添加-hide_banner标志:

ffmpeg -i video_file.mp4 -hide_banner 
ffmpeg -i audio_file.mp3 -hide_banner

使用ffmpeg显示媒体文件的信息

如我们所见,该命令现在仅输出有关我们指定的媒体文件(编码器,流等)的详细信息。

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),则不必使用-strict实验。

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

crf通常在20到30之间,但可以随意使用特定值。

降低帧速率在某些情况下可能会起作用(尽管可能很容易使视频变慢):

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持续时间)以秒为单位,结束时间(-to 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允许我们做的是将cat等命令的结果通过管道(在终端中使用|)输入ffmpeg,而不是一个个地输入所有名称。那正是我要做的。为此,我们还必须提到我们希望复制视频编解码器(-c:v复制)(以正确使用图像):

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:a副本)。对于编解码器,可以使用-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)。我的是19201080。输入之前应提及屏幕尺寸:

ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4

随时按q或者CTRL + C可以停止截屏。

额外的窍门:我们可以在输出文件的大小全屏显示后再输入以下大小(而不是19201080或者任何其他设置的分辨率):

-s $(xdpyinfo | grep dimensions | awk '{print ;}')

这是完整的命令:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print ;}') -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 ;}') -i :0.0 -i audio.wav -c:a copy output.mp4

注意:ffmpeg记录很小,因此可能无法保存很小的记录。我建议将记录时间稍长一些,然后再剪切(如果我们只想几秒钟),以确保将文件实际写入磁盘。

ffmpeg中过滤器的基本用法

过滤器是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的缩写)。实际的过滤器写在双引号()内,并且可以通过用逗号(,)隔开来进行链接。我们可以根据需要指定任意数量的过滤器(我在上面写了其他说明,以注意其他过滤器,它实际上并不是命令的一部分)。

过滤器的一般形式为:

filter=setting_2=value_2:setting_2=value_2

不同的过滤器设置及其值用冒号分隔。

我们还可以将数学运算作为不同设置的值执行。

注意:可以在官方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

此命令将输出大小设置为输入大小(in_w,in_h)的一半(1/2)。

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

此命令将输出大小设置为输入大小(in_w,in_h)的3/4.

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.

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)。

注意:要使用同一命令更改视频和音频的播放速度,我们必须查看过滤器图。