3

私はアンドロイドが初めてで、オーディオ処理に関連するものは初めてです。

そのため、どこから始めればよいかを順を追って説明する必要があります。

私はすでに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 でのオーディオ プログラミングには、2 つの一般的なアプローチがあります。AudioTrack を使用して、Java の SDK にとどまる最初のものを見つけました。

このアプローチの欠点は、オーディオ処理も Java コードのままであり、コンパイルされた C コードよりも遅くなる可能性があることです。ただし、処理を行わない場合のオーディオ レイテンシは実質的に同じです。

Java に固執する場合は、Java をサポートする (ラッパーを介して) 堅牢な FFT ライブラリが必要になる可能性があります。たとえば、この.

SDK (AudioTrack を使用した Java) ではなく NDK アプローチ (OpenSL を使用した C) を選択した場合、セットアップは現在のものよりも複雑になります。非常に良い例があり、ステップバイステップの説明がここにあります。これで、録音したオーディオを再生するための基本的なセットアップと、処理を追加するための開始点が得られます。OpenSL アプローチを実装する場合、オーディオ処理コードを自分で記述してデバッグするのは難しい場合があるため、上記のリンクのような FFT ライブラリの恩恵を受けることができます。

于 2014-03-08T10:32:16.167 に答える
0

Android でリアルタイムのオーディオ分析を行う必要がある場合は、NDK が最適です。

ここでもう少し読むことができます:https://stackoverflow.com/a/22156746/1367571

于 2014-03-07T20:14:10.560 に答える