2013-12-17 30 views
2

我試圖根據錄製在左右聲道中的差異來錄製和處理音頻數據。爲此,我使用音頻記錄類,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:設備擁有多個麥克風相當普遍。雖然他們的主要動機是噪音消除,但也可以將它們用於多聲道錄音。當我在索尼移動音頻團隊工作時,幾乎所有2011年以後開始工作的手機都支持立體聲錄音。 – Michael

回答

0

您無法在設備上以這種方式獲得立體聲輸入。

儘管Nexus 4有兩個麥克風,但它們不是用於立體聲錄音,而是可能用於背景噪音消除。

請參閱https://groups.google.com/forum/#!topic/android-platform/SptXI964eEI其中討論了音頻系統的各種低級別修改以嘗試完成立體聲記錄。

+0

嗨克里斯,正如你建議我遵循鏈接和他們的建議。我紮根手機,最後設法編輯media_profiles.xml文件,使AudioCoderCap的Maxchannels = 2。但仍然存在相同數據的問題。我想知道是否我正在使用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

下面是用於捕獲立體聲音頻的工作示例(測試了三星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(); 
    } 
} 

如果您的手機支持立體聲捕獲,那麼這應該工作:)

相關問題