Próbuję nagrać trochę głosu za pomocą klasy AudioRecord, a następnie zapisać go do pliku wyjściowego .pcm. Chcę, aby mój program kontynuował nagrywanie do momentu naciśnięcia przycisku stop. Niestety, bez względu na to, jak długo nagrywam, rozmiar pliku wyjściowego zawsze wynosi 3528 bajtów i trwa około 20 ms. Również zgodnie z Toolsoft Audio Tools, właściwość tego pliku to: 44100Hz, 16 bitów, stereo, nawet jeśli używam mono z zupełnie inną częstotliwością próbkowania.AudioRecord - zapis pliku PCM
Thread recordingThread;
boolean isRecording = false;
int audioSource = AudioSource.MIC;
int sampleRateInHz = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
byte Data[] = new byte[bufferSizeInBytes];
AudioRecord audioRecorder = new AudioRecord(audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void startRecording(View arg0) {
audioRecorder.startRecording();
isRecording = true;
recordingThread = new Thread(new Runnable() {
public void run() {
String filepath = Environment.getExternalStorageDirectory().getPath();
FileOutputStream os = null;
try {
os = new FileOutputStream(filepath+"/record.pcm");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
while(isRecording) {
audioRecorder.read(Data, 0, Data.length);
try {
os.write(Data, 0, bufferSizeInBytes);
} catch (IOException e) {
e.printStackTrace();
}
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
recordingThread.start();
}
public void stopRecording(View arg0) {
if (null != audioRecorder) {
isRecording = false;
audioRecorder.stop();
audioRecorder.release();
audioRecorder = null;
recordingThread = null;
}
}
Czy mogę prosić, aby mi powiedzieć, co jest nie tak? Mam nadzieję, że odpowiedź nie będzie 'wszystko' :)
Myślę, że Twój kod IO może być problemem. Spróbuj użyć Apache Commons IOUtils do skopiowania strumieni: http://commons.apache.org/io/api-release/org/apache/commons/io/IOUtils.html#copy(java.io.InputStream,%20java.io .OutputStream) –