Featured image of post ffmpeg的使用

ffmpeg的使用

音频

提取多轨音频

# ffmpeg -i 00000.m2ts
Input #0, mpegts, from '.\00000.m2ts':
  Duration: 02:09:25.92, start: 4200.000000, bitrate: 21889 kb/s
  Program 1
  Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn
  Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, 5.1(side), fltp, 640 kb/s
  Stream #0:2[0x1101]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s

可以看到视频中 Audio Steam有两个

# 获取第一条音轨
ffmpeg -i 00000.m2ts -map 0:1 -b:a 64k -f mp3 -vn a.1.mp3

参数解释:

-i表示input,即输入文件

-f表示format,即输出格式

-vn表示video not,即输出不包含视频

-b:a 64k为比特率,默认为128K,这里压缩以下,采用64K

$ ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

在这里,

  • -vn 表明我们已经在输出文件中禁用视频录制。
  • -ar 设置输出文件的音频频率。通常使用的值是22050 Hz、44100 Hz、48000 Hz。
  • -ac 设置音频通道的数目。
  • -ab 表明音频比特率。
  • -f 输出文件格式。在我们的实例中,它是 mp3 格式。

删除视频中的音频

很多人想要知道如何从录制的视频中删除音轨,比如马路噪音或者背景噪音。

删除音频最简单的方法是:只将视频复制到一个新的文件中,而不复制音频。这个方法之所以简单,是因为它无需将视频重新编码。下面是删除音频的命令行:

ffmpeg.exe -i videoWithAudio.mp4 -c:v copy -an videoWithoutAudio.mp4
  • 使用-c:v copy命令将视频复制到videoWithoutAudio.mp4
  • -an告诉FFmpeg不要复制音频

上述方法非常适用于电影中只有一个音轨的情况。但是,如果电影中有3~4个音轨,而你只想删除第二个音轨,该如何操作?

如何通过FFmpeg删除某个特定音轨?

我们在下一部分将学习到。

使用FFmpeg删除特定音频

你可以使用FFmpeg中的map命令来删除特定音轨。

map命令的通用语法是:

-map input_file_index:stream_type_specifier:stream_index

然后,你可以通过-map 0:a:1(从0开始计数)从视频中选择第二个音轨。在上文的例子中,如果你的文件中有一个视频和两个音轨,那么你就可以使用-map 0:a:1只选择第二个音轨,并将它复制到你的最终输出文件中。

同样,-map 0是指选择第一个输入文件中的所有数据(包括音频和视频),所以你需要先选择所有数据,然后取消选择音频。

ffmpeg.exe -i videoWithAudio.mp4 -map 0 -map 0:a:1 -copy videoOutput.mp4

如果电影中有5个音轨,除了第一个,其他你都想选择。这个时候你可以使用反向的map命令(在map命令的参数前加负号)。使用-map -0:a:0 这一命令,FFmpeg在选择时就会忽略第一个音轨。反向的map非常强大!

实际上,我们已在前文学习了使用 -an命令从视频中删除音频。你可以通过如下方式,使用反向的map来达到相同的效果。

ffmpeg -i videoWithAudio.mp4 -map 0 -map -0:a videoWithoutAudio.mp4

使用FFmpeg添加音频

你已经删除了一个音轨,那么你很可能想要再添加一个,对吧?下面我们将学习如何使用FFmpeg向视频中添加音频。

在前文中你已经学习了map命令的使用,因此添加音频对你来说应该很容易。命令行如下所示:

ffmpeg \

-i video.mp4 \

-i audio.mp3 \

-c copy \

-map 0:v:0 \

-map 1:a:0 \
  videoWithAudio.mp4

上面的命令行很容易理解。你所做的就是使用map命令将视频和音频分别从不同的文件中复制到同一个输出文件。

  • -map 0:v:0 选择了第0个输入文件(视频输入)的第0个轨道。
  • –map 1:a:0 选择了第一个输入文件(音频输入)的第0个轨道。
  • 不用重新编码,-c copy同时复制音轨和视轨到输出文件。如果你想要重新编码,可以选择合适的音视频编解码器,配置相应的编码质量。

使用FFmpeg从视频中提取音频

使用FFmpeg从视频提取音频是另一个非常有用且常见的操作。无论是否重新编码音频,你都可以这么做。

让我们先来看看第一种场景:不重新编码,直接从媒体文件中提取音频并保存下来。

提取音频意味着要舍弃掉视频,对吧?使用-vn 命令就可以帮助我们轻松删除视频。-vn命令与删除音频的-an命令类似。

然后,你所要做的就是将音频从源文件复制到目标文件。使用-acodec copy命令即可完成操作,该命令告诉FFmpeg只复制音频而不对其进行重新编码。

ffmpeg -i videoWithAudio.mp4 -vn -acodec copy onlyAudio.aac

很简单,对不对?

现在让我们看下另一种情况:当你提取音频后想要重新对它进行编码。下面是如何使用FFmpeg从视频中提取音频,然后使用libmp3lame将音频编码为不同的质量,并将其存储为mp3文件。

ffmpeg.exe -i videoWithAudio.mp4 -vn -c:a libmp3lame -q:a 1 onlyAudio.mp3

-q:a表示质量(在LAME文档中定义[1]),质量分布范围为0~6,其中0表示高质量音频,6表示低质量音频。

使用FFmpeg从视频中替换音频

如何替换已包含音频的视频中的音轨?这将是我们今天最后研究的一种场景。

在上文我们已经讨论过,有两个步骤:

  • 删除音频
  • 添加替换音频

但有没有更快更好的方法?

有了FFmpeg,总能找到更好的方法!

请看下列命令行:

-map input_file_index:stream_type_specifier:stream_index.

所以,你可以使用-map 1:a:2来选择第二个输入文件中的第三个音轨,因为计数从0开始。

ffmpeg -i video_with_audio.mp4 -i newAudio.wav \

-map 0:0 \

-map 1:0 \

-c:v copy \

-c:a libmp3lame -q:a 1 \

-shortest \
  video_with_newAudio.mp4

在上文的例子中,我们需要从一个文件中获取视频以及另一个文件中获取音频。而map命令非常便捷地完成了上述操作。我们从第一个输入文件(视频)中选择第0个轨道,并从第2个输入文件(音频)中选择第0个轨道。

然后我们原样复制视频并重新编码音频,再将它们一起放入新的文件中。如果你不想重新编码音频,你只需使用-a:c copy命令,那么音频就只被复制而不会重新编码。

-shortest 命令用于确保当达到较短的输入文件(两个输入文件之一)长度时停止转换。如果这个功能在你的用例中无关紧要,那么你可以不使用这一命令。