如何使用ffmpeg可靠地同时改变音调和速度

jak*_*ake 1 audio ffmpeg tempo pitch

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

Sox有一个速度选项,但会截断音量,并且不如ffmpeg广泛可用。mplayer有一个速度选项,可以很好地运行,但是如果没有其他库,我将无法输出。

我似乎了解ffmpeg没有办法改变音调(也许最近才这样做?),但是有办法改变频率或其他一些标志来模仿改变音调吗?看起来很远,找不到合适的解决方案。

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

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

nul*_*ptr 7

截至 2022 年(尽管在 2015 年做出了贡献),FFmpeg 拥有一个rubberband开箱即用的过滤器,没有任何上述丑陋、据称缓慢、质量差和不直观的解决方法。

要使用橡皮带滤波器更改音高,您必须使用半音的频率比来指定音高。这是基于使用公式 (2^x/12),其中 x 代表您想要移调的半音数。

例如,要向上移调一个半音,您可以使用以下命令:

ffmpeg -i my.mp3 -filter:a "rubberband=pitch=1.059463094352953" -acodec copy my-up.mp3
Run Code Online (Sandbox Code Playgroud)

要向下转置,只需对 x 使用负数即可。

要同时更改这两个属性,请指定tempopitch值。该tempo值被指定为原始速度的倍数。

以下命令向下移调一个半音并将速度提高 4 倍:

ffmpeg -i slow.mp3 -filter:a "rubberband=pitch=0.9438743126816935, rubberband=tempo=4" -acodec copy fast.mp3
Run Code Online (Sandbox Code Playgroud)

除非进行统计测量,否则质量下降是难以察觉的。


Siz*_*gia 5

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

  • 嗯,我不知道是否有直接的方法可以做,我唯一能想到的就是用ffprobe获取原始频率的值-只是取值,并删除所有多余的信息,以便您可以将其作为原始代码行的变量。您可以这样操作:`ffmpeg -i &lt;输入文件名&gt; -filter:a“ asetrate = $(ffprobe -v error -show_entries stream = sample_rate -of default = noprint_wrappers = 1:nokey = 1 &lt;输入文件名&gt; )* 1.4“ -y &lt;输出文件名&gt;` (3认同)