私はアンドロイドが初めてで、オーディオ処理に関連するものは初めてです。
そのため、どこから始めればよいかを順を追って説明する必要があります。
私はすでにAndroidAudioRecord
を使用してマイクから音を入力し、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 など) を使用する必要がありますか?