1

我是新来的android和新的任何有关音频处理。在android中处理/处理音频信号?

所以我需要一步一步的指导从哪里开始。

我已经使用android AudioRecord来输入麦克风和AudioTrack类的声音,通过扬声器实时输出,它工作正常。

我想要做的是改变输入信号的幅度/频率并在输出之前添加失真效果。

这是我迄今所做的:

// Calculate minimum buffer size 
    int bufferSize = AudioRecord.getMinBufferSize(44100, 
     AudioFormat.CHANNEL_IN_STEREO,AudioFormat.ENCODING_PCM_16BIT); 
    // AudioRecord Lib 
    final AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC, 44100, 
      AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
      bufferSize); 
    // AudioTrack Lib 
    final AudioTrack audioPlayer = new AudioTrack(
      AudioManager.STREAM_MUSIC, 44100, 
      AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT, 
      bufferSize, AudioTrack.MODE_STREAM); 
    record_button = (Button) findViewById(R.id.start_record); 
    stop_recording = (Button) findViewById(R.id.stop_record); 
    stop_recording.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      System.out.println("Stopped record"); 
      stopped = true; 
      // TODO Auto-generated method stub 
      // recorder.stop(); 
      // recorder.release(); 
      record.stop(); 
      record.release(); 
      audioPlayer.stop(); 
      audioPlayer.release(); 

     } 
    }); 

    record_button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      System.out.println("Recording"); 
      record.startRecording(); 
      audioPlayer.play(); 
      new AsyncBuffer(record,audioPlayer).execute(); 
      } 
    }); 

} 
class asyncBuffer extends AsyncTask<Void, Void, Void>{ 
    AudioRecord record; 
    AudioTrack audioPlayer; 

    public AsyncBuffer(AudioRecord record, AudioTrack audioPlayer) { 
     // TODO Auto-generated constructor stub 
     this.record = record; 
     this.audioPlayer = audioPlayer; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     System.out.println("asynch task"); 

     short[] buffer = new short[160]; 
     while (!stopped) { 
      Log.i("Map", "Writing new data to buffer"); 
      int n = record.read(buffer, 0, buffer.length); 
      audioPlayer.write(buffer, 0, n); 

     } 
     return null; 
    } 
} 

我已经读输入信号,我只需要知道如何处理它在AsyncBuffer类。

是否有可能通过操纵java代码本身的信号在上述代码中添加失真?如果是这样,怎么样?

如果没有,是否有任何Java库,你可以推荐?

另外,这可以通过简单的Android SDK使用包含的类来实现,或者我将不得不深入并使用NDK(Kissfft等)?

+0

这里的问题在于,您似乎并未具体了解您希望进行的转换类型,或者需要执行哪些类型的计算操作。您可能想要在电脑上播放音频效果软件,以便专门优化您的需求。 –

+0

我也是一个音乐家,我制作自己的音乐,所以如果你正在谈论像逻辑和专业工具这样的制作软件,我对那些和吉他插件比如Amplitube和jam up pro非常熟悉,我每天都在使用它们。但是,他们没有真正提供任何深入的音频处理知识,它都在后台..如果你知道我的意思,那就是为什么在这里发布。 。我需要一个开始.. – ashishashen

+0

同样,您必须确定感兴趣的特定效果,并研究导致该效应的适用转换算法。你不能写一个程序来模糊一般,也不能在这里处理非特定的问题。 –

回答

3

还有就是在Android的音频编程两种常用的方法。你已经找到了第一个,那就是使用AudioTrack在java中保留在SDK中。

这种方法的缺点是您的音频处理也保留在java代码中,这可能比编译的C代码慢。没有处理的音频延迟实际上是相同的。

如果您坚持使用Java,您可能需要一个支持Java(通过包装器)的可靠FFT库,例如this

如果您通过SDK(带有AudioTrack的Java)选择NDK方法(C with OpenSL),则设置将比现在更复杂。有一个很好的例子,分步指导here。这应该为您提供播放录制音频的基本设置和添加处理的起点。在实现OpenSL方法时,您仍然可以从上面链接的FFT库中受益,因为您可能很难自己编写和调试音频处理代码。

+0

感谢您清除主要部分。我肯定会使用NDK方法,但假如我想在我的java代码中添加一点失真信号。我能否在没有FFT库的情况下做到这一点?我想我看到了几个例子,他们只是在操纵缓冲区并增加输出信号的增益。 – ashishashen

+0

@ashishashen - 你不应该接受不回答你的问题的答案。你的问题仍然太模糊,无法回答,但目前没有什么理由相信FFT会在解决方案中出现。 –

+0

我接受了这个答案,因为它给了我一个开始。当我知道我究竟是什么时,我可能会重新发布问题的一部分。就像你说的那样,这个问题太模糊,无法回答。 – ashishashen