安卓AudioRecord其设置来通话记录(Android AudioRecord which se

2019-06-24 00:12发布

我用AudioRecord类在通话时录制的声音。

我intererested只记录谁拥有手机(从麦克风)的人的声音。 在录制过程中,我想做些音频处理,但这是offtopic现在。

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的,16000,,2250Hz,44100Hz)。 你能告诉我该怎么选择采样率,为什么?

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

最后是我应该如何多渠道使用,为什么? (AudioFormat.CHANNEL_IN_STEREO或AudioFormat.CHANNEL_IN_MONO)

Answer 1:

你应该总是使用44100作为采样率,因为它是保证根据谷歌工作的唯一的采样率。

“采样率以赫兹表示。44100Hz,目前这是保证在所有设备上工作的唯一速度,但其他费率,如22050,16000,11025,并可能在某些设备上工作。” 开发网站

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

“描述音频信道的配置。参见CHANNEL_IN_MONO和CHANNEL_IN_STEREO。CHANNEL_IN_MONO是保证在所有设备上工作。” 开发网站

最后:8位PCM VS 16bit的PCM:16位使用PCM,

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

只记得使用16位时,使用短[]缓冲区,而不是字节的缓冲区。 由于16位是2个字节,你将有两个项目在同时缓冲结合:

字节] [] {sample_1_upper,sample_1_lower,sample_2_upper,sample_2_lower,...,sample_n_lower}但是,如果你使用短[]缓冲区:
短[] {SAMPLE1,SAMPLE2,...,样本3}

我从来没有试图录制通话内容,但如果操作系统不MIC的源绑定,你也许可以从它记录。 既然你从麦克风录音,你应该只得到了用户的声音。



Answer 2:

你能否解释一下什么是它们之间的差异。 好吧MIC是显而易见的,但VOICE_CALL VS VOICE_UPLINK VS VOICE_DOWNLINK?

VOICE_UPLINK:从您的最终传输到对方的声音。 督察,你对着麦克风讲话(加上根据噪声抑制是否使用以及它如何执行环境噪声)。

VOICE_DOWNLINK:从对方传送到您的最终音频。

VOICE_CALL:VOICE_UPLINK + VOICE_DOWNLINK。



Answer 3:

有点晚了,但你可以查询音频设备,找出它能做什么;

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


文章来源: Android AudioRecord which settings to record call