云网牛站
所在位置:首页 > Linux教程 > 在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

2019-03-31 16:05:18作者:王明著稿源:云网牛站

本文介绍在Linux操作系统中安装和使用ffmpeg的方法,本指南内容有安装ffmpeg、ffmpeg的基本用法及高级用法、过滤基础知识。所用的系统是Ubuntu 18.04,但这些命令也适用于其他Linux发行版。

在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

 

在Ubuntu和其他Linux上安装ffmpeg

安装ffmpeg是一个简单的过程,它是一个流行的应用程序,可通过软件包管理器在大多数Linux发行版中安装。

1、在Ubuntu中安装ffmpeg

在Ubuntu中,ffmpeg在Universe存储库中可用,因此请确保启用Universe存储库,然后更新包列表并安装ffmpeg,以下命令:

sudo add-apt-repository universe

sudo apt update

sudo apt install ffmpeg

只需输入以下命令即可验证安装:

ffmpeg

这应显示一些描述ffmpeg配置的文本(包括版本):

在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

从上面的屏幕截图中可以看出,安装的版本是3.4.4。

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

可以使用非官方PPA来安装最新的ffmpeg版本,只需使用以下命令:

sudo add-apt-repository ppa:jonathonf/ffmpeg-4

sudo apt update

sudo apt install ffmpeg -y

参考:使用PPA源在Ubuntu 18.04系统下安装FFmpeg 4.0.2

3、在基于Arch的发行版中安装ffmpeg

要在基于Arch的发行版中安装ffmpeg,请使用以下命令:

sudo pacman -S ffmpeg

4、在基于Fedora的发行版中安装ffmpeg

要在基于Fedora的Linux发行版中安装ffmpeg,可以使用以下命令:

sudo dnf install ffmpeg

参考:在Fedora 29系统中安装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

在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

使用ffmpeg显示有关媒体文件的信息,其中包含有关ffmpeg的媒体文件的ffmpegDisplay信息。

尽管有用,但此命令将显示与你的文件无关的太多信息(有关ffmpeg的信息),要省略它,请添加-hide_banner选项:

ffmpeg -i video_file.mp4 -hide_banner 

ffmpeg -i audio_file.mp3 -hide_banner

在Linux中安装和使用ffmpeg的方法(以Ubuntu 18.04系统为例)

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

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

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

当然,可以指定所需的任何编解码器(以及与音频/视频相关的任何其他附加选项)。

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 duration)(秒),结束时间(-to HH:MM:SS)和开始时间(-s duration)(以秒为单位)(从持续时间开始)秒)。

所有这些都是有效的命令,你可以使用它们处理媒体文件的任何部分。

 

使用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等,参考GNU nano 4.0发布下载,易于使用的文本编辑器一文),这对我来说是最容易使用的。

在这里,输入你要加入的所有文件的完整路径(它们将按照你在此处写入的顺序加入),每行一个,确保它们具有相同的扩展名(例如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 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:a copy),对于编解码器,你可以使用-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),我的是1920x1080,在输入之前应该提到屏幕尺寸:

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

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

技巧:可以在输出大小(而不是1920x1080或任何其他设置分辨率)之后输出全屏输出文件的大小:

-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并指定default作为输入(-i default):

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中过滤器的基本用法

过滤器是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

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

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

我将介绍视频和音频过滤器,我们来看一些例子吧。

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

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

注意:要使用相同的命令更改视频和音频播放速度,你必须查看滤镜图。

 

结语

在本文中介绍了ffmpeg的安装、基本用法、高级用法和基础知识,这对学习ffmpeg非常有帮助,送给想要使用ffmpeg进行多项任务的人。

 

相关主题

Ubuntu编译ffmpeg实现GPU转码

精选文章
热门文章