在linux中使用ffmpeg

在Ubuntu和其他Linux上安装ffmpeg

在终端中使用以下命令完成这些操作:

1
2
3
sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg

可以使用以下方法验证安装:

1
ffmpeg

如何使用 ffmpeg

基础知识

ffmpeg 命令的基本形式是:
1
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

1、您必须记住,所有文件选项仅适用于它们后面的文件(您必须为下一个文件再次写入它们)。
2、任何前面没有 -i 的文件都被视为输出文件。Ffmpeg 使用您提供的任意数量的输入和输出。您还可以对输入文件和输出文件使用相同的名称,但必须在输出文件名之前添加 -y 标签。
3、您不应该混合输入和输出;首先指定 Input Files(输入文件),然后指定 Output Files(输出文件)。

获取媒体文件信息
  • ffmpeg 的第一个用途是显示有关媒体文件的信息。这可以通过不输入任何输出文件来完成。只需键入:
    1
    ffmpeg -i file_name

    这适用于音频和视频文件;虽然很有用,但此命令将显示太多与您的文件无关的信息(有关 ffmpeg 的信息)。要省略它,请添加 -hide_banner 标志:

1
2
ffmpeg -i video_file.mp4 -hide_banner 
ffmpeg -i audio_file.mp3 -hide_banner
转换媒体文件
  • 使用 ffmpeg 在不同媒体格式之间轻松转换。只需指定输入和输出文件,ffmpeg 将从文件扩展名中获得所需的格式。这适用于视频到视频和音频到音频的转换。以下是一些示例:
    1
    2
    3
    4
    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
  • 您甚至可以指定输出多个文件:
    1
    ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
  • 想要查看受支持的格式,可以使用:
    1
    ffmpeg -formats
  • 同样也可以添加 -hide_banner 来省略有关应用程序的信息。
  • 也可以在输出文件前指定 -qscale 0 参数以保持视频文件的质量:
    1
    ffmpeg -i video_input.wav -qscale 0 video_output.mp4
  • 此外,您可以指定要使用的编解码器,添加 -c:a(用于音频)和 -c:v(用于视频),后跟编解码器的名称,或者如果要使用与原始文件相同的编解码器:
    1
    ffmpeg -i video_input.mp4 -c:v copy -c:a libvorbis video_output.avi

    请注意: 这可能会使文件扩展名更具欺骗性,因此请小心。

从视频中提取音频
  • 要从视频文件中提取音频,请执行简单的转换并添加 -vn 标志:
    1
    ffmpeg -i video.mp4 -vn audio.mp3
    此命令将使用原始文件的比特率。也可以自己使用 -ab (音频比特率)设置:
1
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3

一些常见的比特率是 96k、128k、192k、256k、320k(mp3 支持的最高比特率)。
其他常见选项包括 -ar (音频频率: 22050, 441000, 48000), -ac (音频通道数), -f (音频格式,尽管通常会自动检测)。-ab 也可以替换为 -b:a。例如:

1
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
将视频中的音频去除
  • 与上一个用法类似,我们可以添加一个简单的标签:-an(而不是 -vn)。
    1
    ffmpeg -i video_input.mp4 -an -video_output.mp4

    -an 标签将使该输出文件的所有音频选项变得无用,因为操作结果中没有音频。

从视频中提取图像
  • 从视频中获取图像,只需要输入:
    1
    ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
    -r 指定帧率(一秒提取多少帧到图像中,默认:25),-f 指定输出格式(image2 实际上代表 image2 序列。最后一个参数 %3d。这只是用 3 位数字(000、001 等)对您的图像进行编号。如果需要,您还可以使用 %2d(2 位格式)甚至 %4d(4 位格式)。
更改视频分辨率或纵横比
  • 要调整视频大小,您只需在 -s 标志后指定新的分辨率即可:
    1
    ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
  • 还可以指定 -c:a 以确保输出文件的音频编解码器是正确的:
    1
    ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
  • 还可以使用 -aspect 更改纵横比:
    1
    ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
将海报图像添加到音频
  • 在音频里添加封面:
    1
    ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac  -b:a 192k -shortest output.mp4
    只需更改编解码器(-c:v 指定视频编解码器,-c:a 指定音频编解码器)和文件名。
为视频添加字幕
  • 用 ffmpeg 添加字幕。输入以下内容:
    1
    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
    可以指定所需的任何编解码器(以及与音频/视频相关的任何其他附加选项)。
压缩媒体文件
  • 使用 ffmpeg,有多种方法可以减小文件大小。但过度压缩文件会明显降低结果文件的质量。

  • 对于音频文件,只需降低比特率(使用 -b:a-ab):

    1
    2
    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):
      1
      ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
      可以设置 -crf 标志 (Constant Rate Factor)。较低的 crf 意味着较高的比特率。此外,使用 libx264 作为视频编解码器会有所帮助。这是一个非常有效的尺寸减小方法,质量降低非常小:
      1
      ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
      20 到 30 的 crf 很常见,但您可以随意使用特定值。
    • 在某些情况下,也可以降低帧速率(尽管它很容易使视频感觉迟钝):
      1
      ffmpeg -i video_input.mp4 -r 24 video_output.mp4
      -r 指定帧速率(在本例中为 24)。
    • 还可以压缩音频,使其成为立体声并降低比特率。例如:
      1
      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 负责立体声部分。我已经介绍了降低比特率的部分。
剪切媒体文件
  • 从头开始修剪文件,必须使用 -t 指定持续时间:
    1
    2
    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 指定结束时间:
    1
    2
    3
    4
    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 持续时间) (以秒为单位)(在持续时间秒后开始)。

高级用法

分割媒体文件
  • 要将文件拆分为多个部分,必须做的是指定多个修剪(在每个输出文件之前指定开始时间、结束时间或持续时间)。
    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 开始)。
连接媒体文件
  • 创建一个文本谁的
    1
    2
    touch videos_to_join.txt
    vim videos_to_join.txt
    你可以使用任何你想要的工具,touch或vim都可以
  • 输入你想要加入的所有文件的完整路径(它们将按照你在这里写的顺序加入),每行一个。确保它们具有相同的扩展名(例如 mp4)
    1
    2
    3
    /home/ubuntu/Desktop/video_1.mp4
    /home/ubuntu/Desktop/video_2.mp4
    /home/ubuntu/Desktop/video_3.mp4
    保存您刚刚编辑的文件。此方法适用于任何音频或视频文件。
  • 现在输入以下命令进行合并
    1
    ffmpeg -f concat -i join.txt output.mp4

    我的输出文件output.mp4,那是因为我所有的输入文件都有 mp4 扩展名。
    这会将您在 join.txt 中写下的所有文件合并到一个输出文件中。

将图像合并为视频
  • 首先是确保你想要放在一起的照片位于同一个目录中。推荐用于图片的扩展名是 .png 和 .jpg。无论您选择哪种方式,请确保所有图像都具有相同的扩展名
    我们转换的格式 -f 应该是 image2pipe。对于输入,您必须提供连字符 。image2pipe 允许你做的是将 cat 等命令的结果通过管道|到 ffmpeg 中,而不是一个一个地输入所有名称。这正是我要做的。为此,我们还必须提到我们希望复制视频编解码器 -c:v copy (以正确使用图像):
    1
    cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv
    制作的视频,每张照片 1 帧;FFmpeg(默认)以 23 fps 左右的速度运行。
    要更改此设置,您必须指定所需的帧速率 (-framerate):
    1
    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,这就是我将用于帧速率的值:
    1
    cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv
录制你的屏幕
  • 使用 ffmpeg 进行录屏。需要使用的格式 -fx11grab。这将捕获您的 XSERVER。作为输入,您必须指定屏幕显示编号(主屏幕通常应为 0:0)。但是,这只会捕获屏幕的左上角部分。您应该添加屏幕大小 -s。我的是 1920×1080。屏幕尺寸应在输入之前提及:
    1
    ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
    随时按 q 或 Ctrl+C 可停止录屏视频。
    也可以通过以下方法来录全屏
    1
    ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
录制摄像头
  • 录制来自网络摄像头(或其他设备,如 USB 摄像头)的输入更加容易。在 Linux 中,设备以 /dev/video0、/dev/video1 等形式存储在 /dev 中:
    1
    ffmpeg -i /dev/video0 output.mkv
    再次按 q 或 Ctrl+C 停止录制。
录制你的音频
  • Linux 主要通过 ALSApulseaudio 处理音频。ffmpeg 可以同时录制两者,但我将介绍 pulseaudio,因为基于 Debian 的发行版默认包含它。这两种方法的语法略有不同。
    对于 pulseaudio,您必须强制 -f alsa 并指定 default 作为输入 -i default
    1
    ffmpeg -f alsa -i default output.mp3

本文内容来自:https://itsfoss.com/ffmpeg/#how-to-use-ffmpeg-advanced-usage ,更多的内容可以参考原文,这里仅翻译了其中一部分作为自己日常使用