我希望能夠進行一些音高和速度轉換,混合和修剪聲音以及應用效果。 我試過ffmpeg,但不幸的是,它在處理音頻文件上有一些巨大的延遲(比如在36secs文件上只有40secs的音調+節奏)。在Android中使用FMod進行音高/速度/混音/微調
所以我搜索了一個可以做所有這些功能的圖書館,我發現FMod可能是答案。
雖然我從來沒有玩過NDK,但我在閱讀甚至編寫C代碼時都很糟糕。
你能幫助我如何開始這個冒險嗎?
我希望能夠進行一些音高和速度轉換,混合和修剪聲音以及應用效果。 我試過ffmpeg,但不幸的是,它在處理音頻文件上有一些巨大的延遲(比如在36secs文件上只有40secs的音調+節奏)。在Android中使用FMod進行音高/速度/混音/微調
所以我搜索了一個可以做所有這些功能的圖書館,我發現FMod可能是答案。
雖然我從來沒有玩過NDK,但我在閱讀甚至編寫C代碼時都很糟糕。
你能幫助我如何開始這個冒險嗎?
我終於決定使用FMod來製作我自己的SDK來應用所有我想要的效果。
下面是Java類調用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;
}
}
我還沒打算做整個事情的開源,但如果你們有興趣,隨時問我,我會盡我所能;)
我會通過考慮看看提供的FMOD SDK的例子開始,他們有像應用效果,改變播放頻率任務使用簡單等
請記住,FMOD主要是用於實時音頻播放,所以雖然你可以寫出.wav文件(假設這是你的目標),但這不是主要用法。
嗨克里斯托夫,我感興趣,如果你想分享一些代碼,例如processDSP部分 – Shehabix 2017-04-04 01:26:59
嘿Christophe,如果你能分享你的代碼,我會走在問題中解釋的同一條路徑上,這將是美好的。等待你的回覆 – Gurankas 2017-08-08 06:14:06