立体声录音在左右声道中提供相同的数据

Posted

技术标签:

【中文标题】立体声录音在左右声道中提供相同的数据【英文标题】:Audio Recording in Stereo giving same data in Left and Right channels 【发布时间】:2014-01-05 05:37:21 【问题描述】:

我正在尝试根据左右声道中记录的内容的差异来记录和处理音频数据。为此,我使用音频记录类,麦克风作为输入和立体声模式。

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

我的问题是我在两个渠道中得到完全相同的数据。 (备用样本被分离以获得单独的通道输入)。请帮忙。我不确定为什么会这样。

【问题讨论】:

几乎 100% 的设备不是只有一个麦克风吗?我希望您需要插入一个特殊的立体声麦克风才能真正获得立体声输入。 我的手机是 Nexus 4,有 2 个麦克风。事实上,我还在 manifest.xml 文件中添加了允许立体声录音的权限。 @Tenfour04:拥有多个麦克风的设备相当普遍。尽管它们的主要动机是消除噪音,但也可以将它们用于多通道录音。当我在 Sony Mobile 音频团队工作时,我从 2011 年开始使用的几乎所有手机都支持立体声录音。 @Michael 你能提出解决这个问题的方法吗?我扎根了我的 Nexus 4,甚至更改了 /etc/media_profiles.xml,使 AudioEncoderCap 的 Maxchannels = 2。但我没有看到任何改善。是因为我使用的是未经任何形式压缩的原始音频数据吗? @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];

希望这有帮助。

【讨论】:

感谢您提供的优质信息。现在如何将这些数据写入立体声文件?【参考方案2】:

这是一个以立体声捕获音频的工作示例(使用 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();
    

如果您的手机支持立体捕捉,那么这应该可以工作:)

【讨论】:

【参考方案3】:

您无法在设备上以这种方式获得立体声输入。

虽然 Nexus 4 有两个麦克风,但它们并非用于立体声录音,而是可能用于消除背景噪音。

请参阅https://groups.google.com/forum/#!topic/android-platform/SptXI964eEI,其中讨论了音频系统的各种低级修改以尝试完成立体声录音。

【讨论】:

嗨,克里斯,正如您所建议的,我按照链接和他们的建议进行操作。我扎根了我的手机,最后设法编辑了 media_profiles.xml 文件,使 AudioEncoderCap 的 Maxchannels = 2。但仍然存在相同数据的问题。我想知道问题是否在于我使用 AudioRecord 类(使用 Eclipse SDK)引入了原始音频数据。 media_profiles.xml 中没有相关的压缩标准或定义。如果您有任何建议,请告诉我

以上是关于立体声录音在左右声道中提供相同的数据的主要内容,如果未能解决你的问题,请参考以下文章

mp3格式转换后没有了立体声

把音频信号的左右声道连接起来,对电路有啥影响?

如何在平板电脑/智能手机上启用立体声录音,尽管有两个内置麦克风,但只产生单声道?

谁知道mp3单声道怎么转立体声

在 C 中将立体声 wav 转换为单声道

安卓立体声录音。来自两个不同渠道的完全相同的数据