10

我使用 AudioRecord 类在通话过程中录制语音。

我有兴趣只记录拥有电话的人的声音(来自麦克风)。在录制过程中,我想做一些音频处理,但现在这是题外话。

Android 有以下 AudioSources 选项:

  • MediaRecorder.AudioSource.VOICE_CALL
  • MediaRecorder.AudioSource.MIC
  • MediaRecorder.AudioSource.VOICE_UPLINK
  • MediaRecorder.AudioSource.VOICE_DOWNLINK

你能解释一下它们之间有什么区别吗?好的 MIC 很明显,但是 VOICE_CALL vs VOICE_UPLINK vs VOICE_DOWNLINK ?

另外我应该选择一个采样率(8000Hz、16000Hz、2250Hz、44100Hz)。你能告诉我选择什么采样率,为什么?

对于音频格式,我选择了 AudioFormat.ENCODING_PCM_16BIT,但它也有: - AudioFormat.ENCODING_DEFAULT - AudioFormat.ENCODING_INVALID - AudioFormat.ENCODING_PCM_8BIT

最后是我应该使用多少个频道,为什么?( AudioFormat.CHANNEL_IN_STEREO 或 AudioFormat.CHANNEL_IN_MONO )

4

3 回答 3

12

您应该始终以使用 44100 作为采样率为目标,因为它是唯一保证根据谷歌工作的采样率。

“以赫兹表示的采样率。44100Hz 是目前唯一保证适用于所有设备的速率,但其他速率(例如 22050、16000 和 11025)可能适用于某些设备。” 开发网站

至于立体声与单声道,请使用单声道。

“描述了音频通道的配置。参见 CHANNEL_IN_MONO 和 CHANNEL_IN_STEREO。CHANNEL_IN_MONO 保证在所有设备上都能正常工作。” 开发网站

最后:8bit pcm vs 16bit pcm:使用16bit pcm,

“音频数据格式:每个样本 PCM 16 位。保证设备支持。” 开发网站

请记住在使用 16 位时使用 short[] 缓冲区而不是字节缓冲区。由于 16 位是 2 个字节,因此您必须一次在缓冲区中组合两个条目:

byte][]{sample_1_upper, sample_1_lower, sample_2_upper, sample_2_lower,...,sample_n_lower} 但是,如果您使用短 [] 缓冲区:
short[]{sample1, sample2, ..., sample3}

我从未尝试录制通话,但如果操作系统未绑定 MIC 源,您可能会从中录制。由于您是从麦克风录制的,因此您应该只获得用户的声音。

于 2012-07-17T09:12:26.967 回答
11

你能解释一下它们之间有什么区别吗?好的 MIC 很明显,但是 VOICE_CALL vs VOICE_UPLINK vs VOICE_DOWNLINK ?

VOICE_UPLINK:从你端传输到对方的音频。IOW,你对着麦克风说的话(加上周围的噪音,取决于是否使用了噪音抑制以及它的表现如何)。

VOICE_DOWNLINK:从对方传输到你端的音频。

VOICE_CALL:VOICE_UPLINK + VOICE_DOWNLINK。

于 2012-10-26T16:02:30.647 回答
2

有点晚了,但您可以查询音频设备以了解它可以做什么;

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
String sampleRate =  audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
String sampleBufferSize = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
int bufferSize = AudioRecord.getMinBufferSize(Integer.parseInt(sampleRate), AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
于 2016-03-02T11:18:03.467 回答