本文介绍在Linux操作系统中安装和使用ffmpeg的方法,本指南内容有安装ffmpeg、ffmpeg的基本用法及高级用法、过滤基础知识。所用的系统是Ubuntu 18.04,但这些命令也适用于其他Linux发行版。
在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配置的文本(包括版本):
从上面的屏幕截图中可以看出,安装的版本是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
使用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的媒体文件的ffmpegDisplay信息。 尽管有用,但此命令将显示与你的文件无关的太多信息(有关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),则不必使用-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进行多项任务的人。
相关主题 |