音频信息

查看音频信息

ffmpeg -i video.mp4

查看网络视频的信息

ffmpeg -i http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4

查看音频的布局情况

ffmpeg -layouts

音频抽取

从视频文件中抽取音频

提取完整音频

ffmpeg -i sample.mp4 -q:a 0 -map a sample.mp3

提取指定时间段的音频

ffmpeg -i sample.mp4 -ss 00:03:05 -t 00:00:45.0 -q:a 0 -map a sample.mp3

不重新编码

提取格式不能为MP3,可以是aac和m4a,请执行以下操作:

ffmpeg -i input-video.avi -vn -acodec copy output-audio.aac

-acodec 表示音频解码方式,-vn表示去除视频

重新编码

下面是如何使用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 -i http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4 -acodec copy -vn out_net.mp4

-acodec 用于音频的编码设置

合并

一种方法是连接到一起

ffmpeg64.exe -i "concat:123.mp3|124.mp3" -acodec copy output.mp3

解释:-i代表输入参数
contact:123.mp3|124.mp3代表着需要连接到一起的音频文件
-acodec copy output.mp3 重新编码并复制到新文件中

另一种方法是混合到一起

ffmpeg64.exe -i 124.mp3 -i 123.mp3 -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f mp3 remix.mp3

解释:-i代表输入参数
-filter_complex ffmpeg滤镜功能,非常强大,详细请查看文档
amix是混合多个音频到单个音频输出
inputs=2代表是2个音频文件,如果更多则代表对应数字
duration 确定最终输出文件的长度
longest(最长)|shortest(最短)|first(第一个文件)
dropout_transition
The transition time, in seconds, for volume renormalization when an input stream ends. The default value is 2 seconds.
-f mp3 输出文件格式

删除音频

删除视频中的音频

只将视频复制到一个新的文件中,而不复制音频。

ffmpeg.exe -i videoWithAudio.mp4 -c:v copy -an videoWithoutAudio.mp4
  • 使用-c:v copy命令将视频复制到videoWithoutAudio.mp4
  • -an告诉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 -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同时复制音轨和视轨到输出文件。如果你想要重新编码,可以选择合适的音视频编解码器,配置相应的编码质量。

替换音频

请看下列命令行:
-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命令用于确保当达到较短的输入文件(两个输入文件之一)长度时停止转换。如果这个功能在你的用例中无关紧要,那么你可以不使用这一命令。

绘制音频波形图

绘制多声道混合的音频波形图

ffmpeg -i music.mp3 -filter_complex "showwavespic=s=640*120" -frames:v 1 output.png

绘制不同声道的波形图

ffmpeg -i 1.mp3 -filter_complex "showwavespic=s=640*240:split_channels=1" -frames:v 1 output.png

使用多媒体滤镜 ebur128分析音频响度变化

ebur128扫描滤镜。这个滤镜需要一个音频流,但会原样输出。默认情况下,它以10Hz的频率记录一条消息,其中包括瞬时响度(由M标识)、短期响度(S)、综合响度(I)和响度范围(LRA)。

滤镜有个实时的输出,展示响度的变化,主要的绘图区域包含短期响度(3秒分析),以及其后的舒适响度(400毫秒)

具体参数:https://ffmpeg.org/ffmpeg-all.html#ebur128-1

ffmpeg -nostats -i stars.mp3 -filter_complex ebur128 -f null -

加-report可把结果输出到日志文件

利用EBU放缩规模计+18d的实时图像

ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]"

改变格式

ffmpeg -i audio.mp3 -f ogg out.ogg

-f ogg表示编码格式是ogg

改变采样率

ffmpeg -i audio.mp3 -ar 8000 out.mp3

-ar 用于设置音频采样率

改变比特率

ffmpeg -i audio.mp3 -ab 5000 out.mp3

-ab 用于设置音频比特率

片段截取

-ss 表示开始时间(时:分:秒),-to 表示结束时间(时:分:秒),-t 表示截取时长(时:分:秒)

ffmpeg -i audio.mp3 -ss 0:0:10 -to 0:0:20 out.mp3
ffmpeg -i audio.mp3 -ss 0:0:10 -t 0:0:20 out.mp3

也可以像下面这样,以秒为单位。

ffmpeg -i audio.mp3 -ss 10 -t 20 out.mp3

-ss用于设置开始时间,-t用于设置持续时间

音频声道

改变声道

ffmpeg -i audio.mp3 -ac 1 out.mp3

-ac 用于设置声道,1表示单声道,2表示立体声

双声道合并单声道

ffmpeg -i music.mp3 -ac 1 music.aac

单声道转双声道

ffmpeg -i left.aac -ac 2 output.m4a

双声道的提取

-map_channel [input_file_id.stream_specifier.channel_id|-1][?][:output_file_id.stream_specifier]
方式一:

ffmpeg -i music.mp3 -map_channel 0.0.0 letf.aac -map_channel 0.0.1 right.aac

方式二:
使用pan滤镜

ffmpeg -i music.mp3 -filter_complex "[0:0]pan=1c|c0=c0[left];[0:0]pan=1c|c0=c1[right]" -map "[left]" left.aac -map "[right]" right.aac -y

双声道转双音频流,把双声道音频提取出来转为一个音频文件两个音频流

ffmpeg -i music.mp3 -filter_complex channelsplit=channel_layout=stereo output.mka

可以看到生成的视频就包含了两个流,大多默认情况下播放器只会播放第一个流

将两个音频源合并为双声道

ffmpeg -i left.aac -i right.aac -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" output.mka

//mka为acc编码格式

音频音量

音频音量探测

ffmpeg -i test.mp4 -filter_complex volumedetect -c:v copy -f null /dev/null

mean_volume为获得音频的平均大小

音量设置

使用-vol选项

ffmpeg -i music.mp3 -vol 30 sound_low.mp3

-vol选项接受从0到256的整数值,其中256是最大值

使用表中描述的卷过滤器

音量降低到三分之二

ffmpeg -i music.mp3 -af volume=2/3 quiet_music.mp3

增加10分贝的音量

ffmpeg -i music.mp3 -af volume=10dB louder_sound.mp3

加快/减慢音频节奏

加快

ffplay music.mp3 -af atempo=1.5

减慢

ffplay music.mp3 -af atempo=0.5

chorus 给声音添加合唱效果

可以让独唱变得像合唱,但也可以用于仪表。

合唱与回声效应都有短延迟,但是回波延迟是常数,合唱则采用不同的正弦或三角调制。调制深度范围定义了调制延迟(播放之前或之后的延迟)。因此延迟的声音听起来较慢或更快,这是原来周围的延迟调整声音,像是有一个与合唱整体略微差异。

它接受下面的参数(每个参数项如果有多个可能值用|分隔):

in_gain

设置输出增益,默认0.4

out_gain

设置输出增益,默认0.4

delays

设置延迟,延迟通常在40ms-60ms

decays

设置衰减

speeds

设置速度

depths

设置深度

例子

一个延迟(二人合唱效果)

chorus=0.7:0.9:55:0.4:0.25:2

两个延迟(三人合唱效果)

ffplay music.mp3 -af "chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3"

三个延迟(四人及更多合唱效果)

horus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3

参考文章

FFMPEG常用命令(一):音视频信息与抽取
FFMPEG常用命令(三):音频相关命令
ffmpeg常用音频处理
使用FFmpeg添加、删除、替换和提取视频中的音频
🔨 FFmpeg 提取视频的音频
ffmpeg 多个音频合并 截取 拆分