0

スレッドで次のコードを使用して、マイクから未加工のオーディオ サンプルをキャプチャし、スピーカーから再生します。

public void run(){
            short[] lin = new short[SIZE_OF_RECORD_ARRAY];
            int num = 0;
            // am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); // -> MOVED THESE TO init()
            // am.setMode(AudioManager.MODE_IN_COMMUNICATION);
            record.startRecording();
            track.play();
            while (passThroughMode) {
            // while (!isInterrupted()) {
                num = record.read(lin, 0, SIZE_OF_RECORD_ARRAY);
                for(i=0;i<lin.length;i++)
                    lin[i] *= WAV_SAMPLE_MULTIPLICATION_FACTOR; 
                track.write(lin, 0, num);
            }
            // /*
            record.stop();
            track.stop();
            record.release();
            track.release();
            // */
        }  

は でrecordありAudioRecordtrackAudiotrackです。AudioRecord が PCM データを保存し、AudioTrack が PCM データを再生する方法を詳細に (可能であれば簡単な方法で) 知る必要があります。これは私がこれまでに理解した方法です:

ここに画像の説明を入力

while() ループが継続的に実行recordされているため、図に示すように SIZE_OF_RECORD_ARRAY 数のサンプル (現時点では 1024) を取得します。サンプルは、ショートの lin[] 配列に連続して保存されます (16 ビットの PCM エンコーディングを使用しているため、16 ビットのショート)。これは によって行われrecord.read()ます。次にtrack.write()、ハードウェアによって再生されるスピーカーにこれらのサンプルを配置します。これは正しいですか、それともここで何か不足していますか?

4

1 に答える 1

1

サンプルがメモリ内にどのように配置されるかについては。それらは、音波の線形近似の単なる配列であり、離散時間で取得されます(図が示すように)。ステレオの場合、サンプルはインターリーブされます (LRLRLRLR...)。

オーディオがたどるパスに関しては、基本的には正しいですが、さらにいくつかの手順が必要です。

内蔵マイクから録音する場合、手順はほぼ同じですが、順序が逆になります。

これらの手順の一部 (基本的にはオーディオ HAL 以下のすべて) はプラットフォーム固有であるため、異なるベンダーのプラットフォーム (同じベンダーの異なるプラットフォームであっても) によって異なる場合があることに注意してください。

于 2013-08-21T08:24:59.883 に答える