在android中操纵/处理音频信号?

时间:2014-03-07 14:20:04

标签: android audio android-ndk signal-processing frequency-analysis

我是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等)?

2 个答案:

答案 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