我是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 :(得分:3)
Android中有两种通用的音频编程方法。您已经找到了第一个,它将保留在Java中的SDK中,并使用AudioTrack。
这种方法的缺点是你的音频处理也保留在java代码中,这可能比编译的C代码慢。没有处理的音频延迟实际上是相同的。
如果您坚持使用Java,您可能需要一个支持Java(通过包装器)的实体FFT库,例如this。
如果您选择NDK方法(C with OpenSL)而不是SDK(带有AudioTrack的Java),则设置将比您现在的设置更复杂。有一个很好的例子,一步一步的说明here。这应该为您提供播放录制音频的基本设置和添加处理的起点。在实现OpenSL方法时,您仍然可以从上面链接的FFT库中受益,因为自己编写和调试音频处理代码可能很困难。
答案 1 :(得分:0)
如果您需要在Android上进行实时音频分析,NDK就是您的选择。
您可以在此处阅读更多内容:https://stackoverflow.com/a/22156746/1367571