2012-05-09 10 views
5

Ho provato a creare un buffer audio e inviarlo a una nuova classe. In questa classe vorrei riprodurre questo buffer con AudioTracker ma non funziona. Posso sentire il suono in tempo ma il suono è come un effetto halle. Non ho idear per il mio errore e non ho trovato una risposta per questo problema. Spero che tu possa aiutarmi. (Scusate il mio inglese non è la migliore) Sorcecode:Come posso trasferire il buffer audio per riprodurlo direttamente

public class input { 
private static final String TAG = "Aufnahme"; 
private AudioRecord recorder = null; 
private boolean isRecording = false; 
private int SAMPLERATE = 8000; 
private int CHANNELS = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
private int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; 
private int bufferSize = AudioRecord.getMinBufferSize(SAMPLERATE, CHANNELS, 
     AUDIO_FORMAT); 
private Thread recordingThread = null; 

public void startRecording() { 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLERATE, 
      CHANNELS, AUDIO_FORMAT, bufferSize); 

    recorder.startRecording(); 
    isRecording = true; 

    recordingThread = new Thread(new Runnable() 

    { 
     public void run() { 
      writeAudioData(); 
     } 

    }); 
    recordingThread.start(); 

} 

public void stopRecording() { 
    isRecording = false; 
    recorder.stop(); 
    recorder.release(); 
    recorder = null; 
    recordingThread = null; 
} 

private void writeAudioData() { 

    byte data[] = new byte[bufferSize]; 

    while (isRecording) { 

     recorder.read(data, 0, bufferSize); 
     send(data); 

    } 
} 

private void send(byte[] data) { 

    int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 

    at.play(); 
    at.write(data, 0, bufferSize); 
    at.stop(); 
    at.release(); 

} 

risposta

4

Ok, ho capito il problema. L'effetto Hall proveniva dal suono dell'altoparlante registrato in tempo reale. Brutto errore

+4

Congratulazioni per la correzione! Quando sei in grado, assicurati di contrassegnare la tua risposta come "accettata" in modo che altri possano imparare dalla tua soluzione. Saluti ~ –

+0

Ho giocato con bufferSize e minbufferSize e sono riuscito a ottenere una riproduzione fedele dei dati audio. Ho fissato il buffer di input a 8192 e l'output a 1024. Può essere modificato ulteriormente ma serve al mio scopo. Grazie per il codice originale. Funziona come desiderato – axs

0

La ragione quando si scrivono dati di AudioTrack oggetto, è in realtà apre, scrivere al buffer, chiudere e rilasciarlo, e se la dimensione minima del buffer è così piccolo, non si può effettivamente sentire a causa del costante ri-initilization del Traccia audio. Questo è il motivo per cui è risolto modificando la dimensione del buffer. Se lo fai 8000 e la tua frequenza di campionamento è 8000, sentirai il suono con un secondo di ritardo. Per risolvere questo problema, eliminare il metodo send e modificare il metodo writeAudio a questo:

private void writeAudioData() { byte di dati [] = new byte [bufferSize];

int minBufferSize = AudioTrack.getMinBufferSize(8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT); 

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, 
      AudioFormat.CHANNEL_CONFIGURATION_MONO, 
      AudioFormat.ENCODING_PCM_16BIT, minBufferSize, 
      AudioTrack.MODE_STREAM); 


    at.play(); 

    while (isRecording) { 
     recorder.read(data, 0, bufferSize); 
     at.write(data, 0, bufferSize); 
    } 
    at.stop(); 
    at.release(); 
Problemi correlati