Linux / Mac OS / 其它 · 2022-06-09

ffmpeg将视频文件提取音频转换为mp3

将flac文件转换为mp3文件使用以下命令即可

(同时会将flac文件的Vorbis注释转换为mp3的ID3v2元数据)

ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3

视频提取MP3

从原有视频提取音频

ffmpeg.exe  -i  input.mp4  -vn  output.mp3

截取音频片段

ffmpeg.exe  -i  input.mp3 -ss 00:00:00  -t  00:01:00  output.mp3

上面提取和截取也可合并为一步。

参数说明

-i	输入文件(任意格式)
-vn	不使用视频纪录
-ss	开始时间
-t	持续时间

 

2.音量调整
2.1.基于当前音量倍数处理
<1>将当前音量降低一半:

ffmpeg -i input.mp3 -af volume=0.5 output.mp3

<2>将当前音量提升一倍。这种处理相对粗暴,会使音频出现失真现象:

ffmpeg -i input.mp3 -af volume=2 output.mp3

2.2.基于分贝数值的处理
​ 上面基于倍数的处理可能会导致音频失真,而基于分贝数值的处理则相对会保留音频的原声效果。

<1>音量提升5分贝(db):

ffmpeg -i input.mp3 -filter:”volume=5dB” output.mp3

<2>音量降低5分贝(db):

ffmpeg -i input.mp3 -filter:”volume=-5dB” output.mp3

3.音量的标准化
​ ffmpeg具备对音量标准化的处理功能,即削峰填谷,使整个音频的音量变得平滑

ffmpeg -i input.mp3 -filter:a “loudnorm=i=-14:tp=0.0” output.mp3

 

调整音频速度

ffmpeg -i welcome_30.mp3 -af “atempo=2.0” -vn out.mp3

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

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

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🅰️1(从0开始计数)从视频中选择第二个音轨。在上文的例子中,如果你的文件中有一个视频和两个音轨,那么你就可以使用-map 0🅰️1只选择第二个音轨,并将它复制到你的最终输出文件中。

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

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

如果电影中有5个音轨,除了第一个,其他你都想选择。这个时候你可以使用反向的map命令(在map命令的参数前加负号)。使用-map -0🅰️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✌️0 选择了第0个输入文件(视频输入)的第0个轨道。

–map 1🅰️0 选择了第一个输入文件(音频输入)的第0个轨道。

不用重新编码,-c copy同时复制音轨和视轨到输出文件。如果你想要重新编码,可以选择合适的音视频编解码器,配置相应的编码质量。

生成静音文件

ffmpeg -f lavfi -i anullsrc -t 10 silent-audio.mp3

ffplay -f lavfi -i anullsrc=r=44100:cl=stereo -t 10 silent-audio.mp3

 

 

ffmpeg -i input.wav -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-30dB output.wav

剪去所有从开始到结束遇到的音频中超过1秒的静音片段,

ffmpeg -i input.wav -af silenceremove=stop_periods=-1:stop_duration=0.3:stop_threshold=-30dB output.wav

剪去所有从开始到结束遇到的音频中超过0.3秒的静音片段,

 

C# FFmpeg合并多个音频文件,并指定每段音频的插入时间。

合成音频的FFmpeg命令为:
ffmpeg -i 11.wav -i 13.wav -filter_complex “[0]adelay=1s:all=1[0a];[1]adelay=26s:all=1[1a];[0a][1a]amix=inputs=2[a]” -map “[a]” output.wav

不知道具体啥意思,大概猜测一下,
-i <fileName> 输入文件的路径,有几个文件就几个-i命令
[0]adelay=1s:all=1[0a] [0]和[0a]指的是第几个文件,索引从0开始,adelay=1s 从音频的第一秒开始插入,默认是毫秒,adelay=1000, 如果加后缀s,则指的秒数,此时不支持小数位写法。(4.2版本以下不支持1s这种写法),all:Use last set delay for all remaining channels. By default is disabled. This option if enabled changes how option delays is interpreted.
amix=inputs=2 2指的是一共有几个文件
output.wav 输出文件的路径或者文件名
文件名都支持全路径的写法。可以是 C:\Data\CHN\Other\FFmpegMergeMp3\11.wav 也可以是 11.wav