AudioRecord – запись файла PCM

Я пытаюсь записать какой-то голос с использованием класса AudioRecord, а затем записать его в выходной файл .pcm. Я хочу, чтобы моя программа продолжала запись до нажатия кнопки останова. К сожалению, независимо от того, сколько времени я записываю, размер выходного файла всегда равен 3528 байтам, и он длится около 20 мс. Также в соответствии с инструментальными средствами Toolsoft Audio Tools, свойства этого файла: 44100 Гц, 16 бит, стерео, даже если я использую моно с совершенно другой частотой дискретизации.

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; } } 

Могу ли я попросить вас рассказать мне, что случилось? Я надеюсь, что ответа не будет «все» 🙂

Change your sample rate to 8000 , потому что в эмуляторе вы не cant test with 44100 sample rate.

Используйте источник AudioRecord как показано для воспроизведения в эмуляторе

 private static final int RECORDER_SAMPLERATE = 8000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; AudioRecord audio_record = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement); int BufferElements2Play = 1024; // want to play 2048 (2K) since 2 bytes we use only 1024 int BytesPerElement = 2; // 2 bytes in 16bit format 

Если это не сработает, перейдите в этот блог. Он отлично работает для записи и хранения данных в .pcm .

 try { os.write(Data, 0, bufferSizeInBytes); } catch (IOException e) { e.printStackTrace(); } try { os.close(); } catch (IOException e) { e.printStackTrace(); } 

Это проблема. Вы закрываете FileOutputStream (os.close ()) только после одной записи. Выведите его из цикла while:

 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(); } } 
Intereting Posts
OnSaveInstanceState / onPause – дождитесь, пока состояние полностью сохранено, прежде чем разрешить уничтожение процесса Сохранение флажков Как обрабатывать ориентацию видео с мобильных устройств Android Eclipse Ошибка «Проблема с упаковкой Android» Gradle, где именно поставить «применить плагин»? Список слоев xml для Android не отображается корректно на некоторых устройствах Ключевой хеш не совпадает во время входа в facebook в андроид Разработка приложения похожа на «Google сейчас» – возможно ли использовать распознавание голоса без ввода ключа? Recyclerview onBindViewHolder вызвал все элементы, когда внутри LinearLayout с весами Разрешения на размещение в android Marshmallow applicationaton Ошибка Android: вы должны указать атрибут layout_width Где находится папка Android SDK? Сохранение файлов cookie между HTTP-запросами, отправленными приложениями Android Инициализировать MapFragment программно с помощью Maps API v2 Ошибка добавления пользовательской темы в приложение.