在Android中使用FMod进行音高/速度/混音/修剪

时间:2015-02-24 14:55:38

标签: android audio fmod

我希望能够做一些Pitch和Tempo Shifting,混合和修剪声音并应用效果。 我试过ffmpeg但不幸的是,它在处理音频文件方面有一些巨大的延迟(例如40secs只是36secs文件中的音高+速度)。

所以我在网上搜索了一个可以完成所有这些功能的库,我发现FMod可能就是答案。

我从未玩过NDK,而且我在阅读甚至编写C代码时表现不佳。

你能帮助我开始这次冒险吗?

2 个答案:

答案 0 :(得分:0)

我首先来看一下FMOD SDK提供的示例,它们可以简单地用于应用效果,更改播放频率等任务。

请记住,FMOD主要用于实时音频播放,因此虽然您可以写出.wav文件(假设这是您的目标),但这不是主要用途。

答案 1 :(得分:0)

我最终决定使用FMod制作我自己的SDK来应用我想要的所有效果。

以下是调用NDK的Java类的签名:

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;
    }
}

我没有计划将整个事情做成开源,但如果你们有兴趣,请随时问我,我会尽我所能;)