我用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)
你应该总是使用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的源绑定,你也许可以从它记录。 既然你从麦克风录音,你应该只得到了用户的声音。
你能否解释一下什么是它们之间的差异。 好吧MIC是显而易见的,但VOICE_CALL VS VOICE_UPLINK VS VOICE_DOWNLINK?
VOICE_UPLINK:从您的最终传输到对方的声音。 督察,你对着麦克风讲话(加上根据噪声抑制是否使用以及它如何执行环境噪声)。
VOICE_DOWNLINK:从对方传送到您的最终音频。
VOICE_CALL:VOICE_UPLINK + VOICE_DOWNLINK。
有点晚了,但你可以查询音频设备,找出它能做什么;
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);