3

簡単な質問があります:

Android デバイスを最新のマイクに変えるにはどうすればよいですか? 、

私はオーディオを録音したくありません。ただ欲しいのです:

  1. 話す

  2. オーディオは、たとえばスピーカーが接続されている 3.5 ジャック出力 (入力なし) に転送されます。

ありがとう 。

編集:これが私が使用しているコードです。ここに貢献してくれたすべての人に感謝し、@ user1917769の作業回答に感謝します。実際のマイクデバイスとして問題なく動作するラグはありません:

 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioRecord;
 import android.media.AudioTrack;
 import android.media.MediaRecorder;
 import android.media.MediaRecorder.AudioSource;
 import android.util.Log;

 public class TOne extends Thread {
 private Thread T1;
 private byte audiobuffer[] = new byte[20];
 public boolean Okay = true;
 public AudioRecord a;
 public AudioTrack aud;
 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
 @Override
 public void run() {
 // TODO Auto-generated method stub
 //super.run();
int i=AudioRecord.getMinBufferSize(8000 , AudioFormat.CHANNEL_IN_MONO ,      AudioFormat.ENCODING_PCM_16BIT);
a= findAudioRecord();

if(a.getState() != AudioRecord.STATE_INITIALIZED){
   a= findAudioRecord();  
 }
  a.startRecording();
    Log.e("Play Audio" , "Start");

 aud = new AudioTrack(AudioManager.STREAM_MUSIC,8000,
         AudioFormat.CHANNEL_OUT_MONO,   AudioFormat.ENCODING_PCM_16BIT,AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_OUT_MONO,
     AudioFormat.ENCODING_PCM_16BIT),AudioTrack.MODE_STREAM);

 if(aud.getState() != AudioTrack.STATE_INITIALIZED){
aud = new AudioTrack(AudioManager.STREAM_MUSIC,8000,
         AudioFormat.CHANNEL_OUT_MONO,      AudioFormat.ENCODING_PCM_16BIT,AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_OUT_MONO,
         AudioFormat.ENCODING_PCM_16BIT),AudioTrack.MODE_STREAM);

 }
          aud.play();
         while(Okay){


                 a.read(audiobuffer,0,audiobuffer.length);

                        ////Log.e("IS_ACTIVE", "YES");
                         aud.write(audiobuffer,0,audiobuffer.length);



 }



 }


 public AudioRecord findAudioRecord() {

for (int rate : mSampleRates) {
    for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT,      AudioFormat.ENCODING_PCM_16BIT }) {
        for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO,      AudioFormat.CHANNEL_IN_STEREO }) {
            try {
                Log.d("C.TAG", "Attempting rate " + rate + "Hz, bits: " + audioFormat +      ", channel: "
                        + channelConfig);
                int bufferSize = AudioRecord.getMinBufferSize(rate,      AudioFormat.CHANNEL_IN_MONO , AudioFormat.ENCODING_PCM_16BIT);

                if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                    // check if we can instantiate and have a success
                    AudioRecord recorder = new AudioRecord(AudioSource.MIC, 8000,      channelConfig, audioFormat, bufferSize);

                    if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                        return recorder;
                }
            } catch (Exception e) {
                Log.e("C.TAG", rate + "Exception, keep trying.",e);
            }
        }
    }
}
return null;
 }

 private void LetsPlayThatsAudio() {
// TODO Auto-generated method stub







 }


 }

しかし、これをスレッドを実装するサービスに入れて、簡単に開始/停止できるようにすることを考えています

4

1 に答える 1

2

このためには、最初にモバイル マイクからサウンドを録音し、それを同時に電話で再生する必要があります。録音作業については、スレッド 1 でこれを試して、オーディオ バッファ バイト配列でデータを取得します。

        int i=AudioRecord.getMinBufferSize(8000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCO DING_PCM_16BIT);
        AudioRecord a= new AudioRecord(MediaRecorder.AudioSource.MIC,8000,
        AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,i);
        a.startRecording();
        byte audiobuffer[]=new byte[20];
        new thread2().start();
        while(true)
        {
             a.read(audiobuffer,0,audiobuffer.length);
        }

同時に、3.5 mm ジャックにサウンドを出力するデータを再生するには、スレッド 2 でこのコードを試してください。

 AudioTrack aud= new AudioTrack(AudioManager.STREAM_MUSIC,8000,
 AudioFormat.CHANNEL_CONFIGURATION_MONO,       AudioFormat.ENCODING_PCM_16BIT,AudioTrack.getMinBufferSize(8000,AudioFormat.CHANNEL_CONFIGURATION_MONO,
 AudioFormat.ENCODING_PCM_16BIT),AudioTrack.MODE_STREAM);
 aud.play();
while(true)
{ 
    aud.write(audiobuffer,0,audiobuffer.length);

}
于 2013-07-06T14:01:47.740 に答える