如何使用 ffmpeg 可靠地一起改变音高和节奏

How to change pitch and tempo together, reliably with ffmpeg

我知道如何用 atempo 改变速度,但是音频文件有点失真,而且我找不到改变音高的可靠方法。 (比如,将节奏和音高一起提高 140%)

Sox 有一个速度选项,但会截断音量并且不像 ffmpeg 那样广泛可用。 mplayer 有一个速度选项,效果很好,但没有额外的库我无法输出。

我似乎明白 ffmpeg 没有办法改变音高(也许最近有?)但是有没有办法改变频率或其他一些标志来模拟改变音高?找了好远,找不到合适的解决方案。

编辑:asetrate:48k*1.4(假设最初是 48k)似乎不起作用,失真和音高仍然没有太大变化。

Edit2:https://superuser.com/a/1076762 这个答案有点效果,但质量比 sox speed 1.4 选项

低得多

ffmpeg -i <input file name> -filter:a "asetrate=<new frequency>" -y <output file name> 似乎对我有用。我用 ffprobe 检查了输入和输出文件的属性,似乎没有任何可能影响其质量的差异。尽管我确实 运行 几次并且其中一些生成的文件有一些伪影,即使代码行是相同的,所以它可能是由一些 ffmpeg 错误引起的;如果您对质量不满意,请尝试 运行 再试一次。

截至 2022 年(虽然 contributed in 2015), FFmpeg has a rubberband 过滤器开箱即用,没有任何上述丑陋、据称速度慢、质量差和不直观的解决方法。要通过相同的因素更改两个属性,请指定 tempopitch 相同。除非进行统计测量,否则质量下降是察觉不到的。