我是 android 新手,对与音频处理相关的任何事情都是新手。
所以我需要从哪里开始一步一步的指导。
我已经使用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 等)?