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