在 Android 中使用 FMod for pitch/tempo/mix/trim
Using FMod in Android for pitch/tempo/mix/trim
我希望能够进行一些音调和速度转换、混音和 trim 声音以及应用效果。
我试过 ffmpeg 但不幸的是,它在处理音频文件时有一些巨大的延迟(比如 40 秒对于 36 秒文件的音高 + 速度)。
所以我在网上搜索了一个可以实现所有这些功能的库,我发现 FMod 可能就是答案。
虽然我从来没有玩过 NDK,而且我不擅长阅读甚至编写 C 代码。
你能帮我看看如何开始这次冒险吗?
我先看看 FMOD SDK 提供的示例,它们对应用效果、更改播放频率等任务有简单的用法。
请记住,FMOD 主要用于实时音频播放,因此虽然您可以写出 .wav 文件(假设这是您的目标),但它不是主要用途。
我最终决定使用 FMod 制作我自己的 SDK 来应用我想要的所有效果。
这里是 Java class 调用 NDK 的签名:
public static native String mix(String[] inputFiles, float secondaryVolume, String outFile);
public static native String trim(String inFile, String outFile, long startMs, long endMs);
public static native String fadeOut(String inFile, String outFile, long startMs, long endMs);
public static native String processDSPs(String inFile, String outFile, FMODDSP[] dsps);
摘要 FMODDSP
看起来像:
public abstract class FMODDSP
{
public static final int FMOD_DSP_TYPE_COMPRESSION = 1;
public static final int FMOD_DSP_TYPE_ECHO = 2;
public static final int FMOD_DSP_TYPE_FLANGE = 3;
public static final int FMOD_DSP_TYPE_LOWPASS = 4;
public static final int FMOD_DSP_TYPE_HIGHPASS = 5;
public static final int FMOD_DSP_TYPE_PITCH = 6;
public static final int FMOD_DSP_TYPE_REVERBERATION = 7;
public static final int FMOD_DSP_TYPE_DISTORTION = 8;
public static final int FMOD_DSP_TYPE_TEMPO = 9;
public static final int FMOD_DSP_TYPE_CHORUS = 10;
protected int type;
public FMODDSP(int type)
{
this.type = type;
}
public int getType()
{
return this.type;
}
}
音高 FMODDSP
的示例实现是:
public class FMODDSPPitch extends FMODDSP
{
/**
* Pitch value. 0.5 to 2.0. Default = 1.0. 0.5 = one octave down, 2.0 = one octave up. 1.0 does not change the pitch.
*/
public float pitch = 1f;
/**
* FFT window size. 256, 512, 1024, 2048, 4096. Default = 1024. Increase this to reduce 'smearing'. This effect is a warbling sound similar to when an mp3 is encoded at very low bitrates.
*/
public float fftSize = 1024f;
public FMODDSPPitch()
{
super(FMODDSP.FMOD_DSP_TYPE_PITCH);
}
public FMODDSPPitch(float pitch, float fftSize)
{
super(FMODDSP.FMOD_DSP_TYPE_PITCH);
this.pitch = pitch;
this.fftSize = fftSize;
}
public float getPitch()
{
return this.pitch;
}
public float getFFTSize()
{
return this.fftSize;
}
}
我还没有打算将整个东西开源,但如果你们有兴趣,请随时问我,我会尽力而为;)
我希望能够进行一些音调和速度转换、混音和 trim 声音以及应用效果。 我试过 ffmpeg 但不幸的是,它在处理音频文件时有一些巨大的延迟(比如 40 秒对于 36 秒文件的音高 + 速度)。
所以我在网上搜索了一个可以实现所有这些功能的库,我发现 FMod 可能就是答案。
虽然我从来没有玩过 NDK,而且我不擅长阅读甚至编写 C 代码。
你能帮我看看如何开始这次冒险吗?
我先看看 FMOD SDK 提供的示例,它们对应用效果、更改播放频率等任务有简单的用法。
请记住,FMOD 主要用于实时音频播放,因此虽然您可以写出 .wav 文件(假设这是您的目标),但它不是主要用途。
我最终决定使用 FMod 制作我自己的 SDK 来应用我想要的所有效果。
这里是 Java class 调用 NDK 的签名:
public static native String mix(String[] inputFiles, float secondaryVolume, String outFile);
public static native String trim(String inFile, String outFile, long startMs, long endMs);
public static native String fadeOut(String inFile, String outFile, long startMs, long endMs);
public static native String processDSPs(String inFile, String outFile, FMODDSP[] dsps);
摘要 FMODDSP
看起来像:
public abstract class FMODDSP
{
public static final int FMOD_DSP_TYPE_COMPRESSION = 1;
public static final int FMOD_DSP_TYPE_ECHO = 2;
public static final int FMOD_DSP_TYPE_FLANGE = 3;
public static final int FMOD_DSP_TYPE_LOWPASS = 4;
public static final int FMOD_DSP_TYPE_HIGHPASS = 5;
public static final int FMOD_DSP_TYPE_PITCH = 6;
public static final int FMOD_DSP_TYPE_REVERBERATION = 7;
public static final int FMOD_DSP_TYPE_DISTORTION = 8;
public static final int FMOD_DSP_TYPE_TEMPO = 9;
public static final int FMOD_DSP_TYPE_CHORUS = 10;
protected int type;
public FMODDSP(int type)
{
this.type = type;
}
public int getType()
{
return this.type;
}
}
音高 FMODDSP
的示例实现是:
public class FMODDSPPitch extends FMODDSP
{
/**
* Pitch value. 0.5 to 2.0. Default = 1.0. 0.5 = one octave down, 2.0 = one octave up. 1.0 does not change the pitch.
*/
public float pitch = 1f;
/**
* FFT window size. 256, 512, 1024, 2048, 4096. Default = 1024. Increase this to reduce 'smearing'. This effect is a warbling sound similar to when an mp3 is encoded at very low bitrates.
*/
public float fftSize = 1024f;
public FMODDSPPitch()
{
super(FMODDSP.FMOD_DSP_TYPE_PITCH);
}
public FMODDSPPitch(float pitch, float fftSize)
{
super(FMODDSP.FMOD_DSP_TYPE_PITCH);
this.pitch = pitch;
this.fftSize = fftSize;
}
public float getPitch()
{
return this.pitch;
}
public float getFFTSize()
{
return this.fftSize;
}
}
我还没有打算将整个东西开源,但如果你们有兴趣,请随时问我,我会尽力而为;)