3

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

4

2 回答 2

4

Android 中的音频编程有两种通用方法。你找到了第一个,就是在java中留在SDK中,带有AudioTrack。

这种方法的缺点是您的音频处理也保留在 java 代码中,这可能比编译的 C 代码慢。但是,未经处理的音频延迟实际上是相同的。

如果您坚持使用 Java,您可能需要一个支持 Java(通过包装器)的可靠 FFT 库,例如.

如果您选择 NDK 方法(C 与 OpenSL)而不是 SDK(Java 与 AudioTrack),则设置将比您现在拥有的更复杂。有一个很好的例子,这里有分步说​​明。这应该为您提供播放录制音频的基本设置和添加处理的起点。在实施 OpenSL 方法时,您仍将受益于 FFT 库(例如上面链接的库),因为自己编写和调试音频处理代码可能很困难。

于 2014-03-08T10:32:16.167 回答
0

如果您需要在 Android 上进行实时音频分析,NDK 是您的最佳选择。

您可以在这里阅读更多内容:https ://stackoverflow.com/a/22156746/1367571

于 2014-03-07T20:14:10.560 回答