Bir işlevi var, ses kaydeder ve bir dosyaya kaydeder. Geri bu kaydedilen ses oynar playrecord adlı başka işlevi varOynat Gerçek zamanlı olarak mikrofondan sesi geri al
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();
}
}
:
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();
}
}
Bu iki işlev bağımsız iyi çalışır Bu nedir benzemesidir. StartRecord() işlevini çağırır ve playRecord'u çağırırsam, sesi duyabiliyorum. Ama yapmak istediğim, sesi GERÇEK ZAMANLA çal, yani kayıt yapmaya başladığım anda sesin çalmasını istiyorum. Bunu başarmak için ne yapmalıyım?
ama gecikme süresi ne kadar? –
Bu gerçekten yüksek performanslıdır. Elbette biraz gecikme var ama sanırım sorununuzu çözmenin en hızlı yolu. Daha fazla bilgiye ihtiyacınız varsa https://www.youtube.com/watch?v=d3kfEeMZ65c adresini izlemenizi önerebilirim. – Xry
Bu satırlarda bir NullPointer Özel Durum var: AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create (record.getAudioSessionId()); echoCancler.setEnabled (true); – AlinaBM