2013-12-17 2 views
2

Я пытаюсь записывать и обрабатывать аудиоданные на основе различий в том, что записывается в левый и правый каналы. Для этого я использую класс Audio Record, с MIC в качестве входного и STEREO-режима.Аудиозапись в стерео с теми же данными в левом и правом каналах

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, 
            AudioFormat.CHANNEL_IN_STEREO, 
            AudioFormat.ENCODING_PCM_16BIT, bufferSize); 

Моя проблема заключается в том, что я получаю точно одинаковые данные в обоих каналах. (альтернативные сэмплы разделяются для получения отдельных входных каналов). Пожалуйста помоги. Я не знаю, почему это происходит.

+0

Дон Почти почти 100% устройств имеют только один микрофон? Я ожидаю, что вам понадобится подключить специальный стереомикрофон, чтобы получить стерео вход. – Tenfour04

+0

Мой телефон Nexus 4 и имеет 2 микрофона. На самом деле я также добавляю разрешение в файле manifest.xml, чтобы разрешить запись в стерео. – Neetha

+0

@ Tenfour04: Для устройств достаточно много микрофонов. Хотя их основной мотивацией является шумоподавление, их также можно использовать для многоканальной записи. Назад, когда я работал в звуковой команде Sony Mobile почти со всеми телефонами, с которыми я работал в 2011 году, и поддерживал стереофоническую запись. – Michael

ответ

0

Вы не можете получить стереофонический ввод таким образом на вашем устройстве.

Несмотря на то, что Nexus 4 имеет два микрофона, они не предназначены для стереозаписи, но вместо этого, скорее всего, будут отменены фоновые шумы.

См. https://groups.google.com/forum/#!topic/android-platform/SptXI964eEI, где различные низкоуровневые модификации аудиосистемы обсуждаются в попытке выполнить стереозапись.

+0

Привет, Крис, Как ты и предложил, я пошел по ссылке и их предложениям. Я укоренил свой телефон и, наконец, смог отредактировать файл media_profiles.xml, чтобы сделать Maxchannels = 2 для AudioEncoderCap. Но проблема с такими же данными сохраняется. Интересно, проблема в том, что я привожу исходные аудиоданные с использованием класса AudioRecord (используя Eclipse SDK). Для этого в media_profiles.xml нет соответствующих стандартов или определений сжатия. Пожалуйста, дайте мне знать, если у вас есть предложения – Neetha

1

Используя эту конфигурацию:

private int audioSource = MediaRecorder.AudioSource.MIC; 
private static int sampleRateInHz = 48000; 
private static int channelConfig = AudioFormat.CHANNEL_IN_STEREO; 
private static int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 

Данные в аудиоданных состоит в следующем.

leftChannel data: [0,1],[4,5]... 
rightChannel data: [2,3],[6,7]... 

Так что вам нужно разделить данные.

readSize = audioRecord.read(audioShortData, 0, bufferSizeInBytes); 
for(int i = 0; i < readSize/2; i = i + 2) 
{ 
     leftChannelAudioData[i] = audiodata[2*i]; 
     leftChannelAudioData[i+1] = audiodata[2*i+1]; 
     rightChannelAudioData[i] = audiodata[2*i+2]; 
     rightChannelAudioData[i+1] = audiodata[2*i+3]; 
} 

Надеюсь, это поможет.

+0

спасибо за хорошую информацию. теперь, как записать эти данные в стереофайл? – Sadegh

1

Вот рабочий пример для записи аудио в режиме стерео (протестировано с Samsung Galaxy S3 4.4.2 SlimKat):

private void startRecording() { 
    String filename = Environment.getExternalStorageDirectory().getPath()+"/SoundRecords/"+System.currentTimeMillis()+".aac"; 
    File record = new File(filename); 
    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
    recorder.setAudioEncodingBitRate(128000); 
    recorder.setAudioSamplingRate(96000); 
    recorder.setAudioChannels(2); 
    recorder.setOutputFile(filename); 
    t_filename.setText(record.getName()); 
    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Если ваш телефон поддерживает стерео захвата, то это должно работать :)