Ho una funzione che registra l'audio e lo memorizza in un file. Questo è ciò che è appare come:Riproduzione audio dal microfono in tempo reale
private void startRecord(){
File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");
int sampleFreq = (Integer)spFrequency.getSelectedItem();
try {
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
DataOutputStream dataOutputStream = new DataOutputStream(bufferedOutputStream);
int minBufferSize = AudioRecord.getMinBufferSize(sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
short[] audioData = new short[minBufferSize];
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
minBufferSize);
audioRecord.startRecording();
while(recording){
int numberOfShort = audioRecord.read(audioData, 0, minBufferSize);
for(int i = 0; i < numberOfShort; i++){
dataOutputStream.writeShort(audioData[i]);
}
}
audioRecord.stop();
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Ho un'altra funzione, chiamata playrecord, che riproduce l'audio registrato:
void playRecord(){
File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");
int shortSizeInBytes = Short.SIZE/Byte.SIZE;
int bufferSizeInBytes = (int)(file.length()/shortSizeInBytes);
short[] audioData = new short[bufferSizeInBytes];
try {
InputStream inputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
int i = 0;
while(dataInputStream.available() > 0){
audioData[i] = dataInputStream.readShort();
i++;
}
dataInputStream.close();
int sampleFreq = (Integer)spFrequency.getSelectedItem();
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
sampleFreq,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSizeInBytes,
AudioTrack.MODE_STREAM);
audioTrack.play();
audioTrack.write(audioData, 0, bufferSizeInBytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Queste due funzioni funzionare bene in modo indipendente. Se chiamo startRecord(), e poi chiamo playRecord, sono in grado di sentire l'audio. Ma quello che voglio fare è, riprodurre il suono in REAL TIME, cioè non appena inizio la registrazione, voglio che l'audio suoni. Cosa devo fare per raggiungere questo obiettivo?
ma quanto costa la latenza? –
È davvero ad alte prestazioni. Certo, c'è un po 'di latenza, ma immagino che sia il modo migliore per risolvere il tuo problema. Se hai bisogno di maggiori informazioni, ti suggerisco di guardare https://www.youtube.com/watch?v=d3kfEeMZ65c. – Xry
Ho ottenuto un'eccezione NullPointer in questo modo: AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create (record.getAudioSessionId()); echoCancler.setEnabled (true); – AlinaBM