2015-02-16 2 views
0

Я попытался использовать AudioTrack.write() для прослушивания записанного звука, но без вывода, поэтому мне нужно записать аудио через AudioRecord и воспроизвести его с помощью AudioTrack без сохраните его на SD-карте или внутреннем хранилище, поэтому любая помощь будет оценена.Воспроизведение записанного звука с помощью AudioRecord.write()

public class MainActivity extends Activity { 


short[]buffer=new short[512]; 
AudioManager am = null; 
AudioRecord record =null; 
AudioTrack track =null; 

protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    setVolumeControlStream(AudioManager.MODE_IN_COMMUNICATION); 

    init(); 

    final Button jjbt1=(Button)findViewById(R.id.jt1); 
    final Button jjbt2=(Button)findViewById(R.id.jt2); 

    am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); 
    am.setMode(AudioManager.MODE_IN_COMMUNICATION); 

    record.startRecording(); 
    track.play(); 


    jjbt1.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      for(int i=0 ; i<512 ; i++){ 
       record.read(buffer, 0,512); 
      } 
       record.stop(); 
     } 
    }); 
    jjbt2.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v) { 
      try{ 
        track.write(buffer, 0,buffer.length); 
       }catch(Exception de){Toast.makeText(getBaseContext(), de.getMessage().toString(), Toast.LENGTH_LONG).show();} 
     } 
    }); 
} 
private void init() { 
     int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
     record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, min); 
     int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 
     track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, 
     AudioFormat.ENCODING_PCM_16BIT, maxJitter, AudioTrack.MODE_STREAM); 
    } 
} 

ответ

0

Это работает для меня:

boolean isRecording = false; 
AudioManager am = null; 
AudioRecord record = null; 
AudioTrack track = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setVolumeControlStream(AudioManager.MODE_IN_COMMUNICATION); 

    initRecordAndTrack(); 

    am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); 
    am.setSpeakerphoneOn(true); 

    (new Thread() 
    { 
     @Override 
     public void run() 
     { 
      recordAndPlay(); 
     } 
    }).start(); 

    Button startButton = (Button) findViewById(R.id.start_button); 
    startButton.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if (!isRecording) 
      { 
       startRecordAndPlay(); 
      } 
     } 
    }); 
    Button stopButton = (Button) findViewById(R.id.stop_button); 
    stopButton.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if (isRecording) 
      { 
       stopRecordAndPlay(); 
      } 
     } 
    }); 
} 

private void initRecordAndTrack() 
{ 
    int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, 
          min); 
    if (AcousticEchoCanceler.isAvailable()) 
    { 
     AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create(record.getAudioSessionId()); 
     echoCancler.setEnabled(true); 
    } 
    int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter, 
          AudioTrack.MODE_STREAM); 
} 

private void recordAndPlay() 
{ 
    short[] lin = new short[1024]; 
    int num = 0; 
    am.setMode(AudioManager.MODE_IN_COMMUNICATION); 
    while (true) 
    { 
     if (isRecording) 
     { 
      num = record.read(lin, 0, 1024); 
      track.write(lin, 0, num); 
     } 
    } 
} 

private void startRecordAndPlay() 
{ 
    record.startRecording(); 
    track.play(); 
    isRecording = true; 
} 

private void stopRecordAndPlay() 
{ 
    record.stop(); 
    track.pause(); 
    isRecording = false; 
} 

Кроме того, необходимо две кнопки в вашем activity_main макет с идентификатором start_button и stop_button.

Этот образец также содержит EchoCanceler!

Удачи вам!

+0

Я очень ценю ваши усилия, но мне не нужны записи и треки для работы синхронно, моя проблема в отдельном их, я имею в виду запись звука и передачу записанных звуковых данных в буферный массив (lin в вашем случае) и, наконец, играйте их в соответствии с моим действием (например, нажмите btn). Спасибо –

+0

что-то важное для вас, чтобы знать, что основная идея моего приложения. заключается в вставке записанного звука в базу данных через zend framework. Мне очень жаль, потому что мои вопросы не организованы. Благодарю вас. –

Смежные вопросы