如何使用ffmpeg改变音频的节奏和音高?

7
我已经成功地使用FFmpeg和AudioTrack类在我的Android项目中播放音频文件。我可以使用AudioTrack类的setRate方法改变音频的速度。但它也会改变音频的音调,我只想改变音频的节奏,但是我在网络上找不到解决方案。
希望有人能帮助我解决这个问题,因为目前没有相关支持。
4个回答

16

您可以在ffmpeg 1.0及更高版本中使用atempo滤镜:

ffmpeg -i input.wav -f:a atempo=1.25 output.wav

atempo 只接受 0.5 到 2.0 之间的值,但您可以通过链接多个滤镜来绕过此限制:

ffmpeg -i input.wav -f:a atempo=2,atempo=1.5 output.wav

但是使用这个会缩短原始音频的持续时间。如果我想保留原始持续时间和修改后的音高怎么办? - Vikrant_Dev
9
在至少为N-77870版本的Windows上,似乎需要拼出单词“filter”,例如ffmpeg -i input.wav -filter:a atempo=1.25 output.wav - User
6
使用FFmpeg命令ffmpeg -i input.wav -af atempo=1.25 output.wav可以将音频文件input.wav加速1.25倍并输出为output.wav。 - Shovalt
ffmpeg -i input.wav -af atempo=1.0827 output.wav - ariane26

8

解决方案: 我尝试了SoundTouch库。我已经成功为Android编译它,但是我无法使用它的功能,因为我不知道如何使用这个库来加载音频。

但是之后我尝试了一个名为Sonic的库。它基本上用于语音,因为它使用PSOLA算法来改变音高和节奏。但没关系。


嗨,Vipul。我正在尝试在我的Android应用程序中连接和更改mp3文件的速度。由于我是Android的新手,我不知道如何使用你上面建议的Sonic库。由于您已经处理过音频文件,我希望您能为我的问题提供解决方案。如果您可以帮助我更改速度,那将是一个很大的帮助。如果您有答案,我可以发布一个问题。谢谢Vipul。 - Harsh
你好 @Harsh User,OpenSL ES库是Android操作系统的一部分,请尝试查看这个问题OPEN SL ES,这将帮助您使用OpensSL ES库。 - Vipul Purohit
@Vipul Purhit,我正在开发一个视频播放器,可以录制视频并操作其声音,例如改变音调。由于libsonic仅适用于音频文件,我该如何使用它来实现这一功能? - Talha Malik
1
嗨@VipulPurohit,我已经浏览了Sonic库,并在其中看到了一个talking.bin文件,你能告诉我如何通过录制或手动从任何mp3等文件制作该.bin文件吗? - Jagdeep Singh

2

音调和节奏是密切相关的。你想要做的是所谓的“时间拉伸”,这是一个有点复杂的算法。你可以在网上找到相关信息,也可以在这里找到一个Java库,其中包括描述该过程的论文。


1

回答者 @Lri 给出的方法对我无效,显示错误:

'atempo=1.2' is not a suitable output format

下一个命令正常工作:
ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

ffmpeg.org中获取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接