虚拟Mic Android 8.1 方案;硬件无Mic设备,实现预先录制的语音,在各App Voip,录音等使用场景下,语音发送。补齐虚拟直播技术重要一环。
在Hal层下read 填充pcm data;
方案的关键:
Android下PCM 语音的 参数, Sample 采样率,samplingRates="8000,11025,12000,16000,22050,24000,32000,44100,48000"
数据data格式,AUDIO_FORMAT_PCM_16_BIT
PCM 单 立体声道 AUDIO_CHANNEL_IN_MONO AUDIO_CHANNEL_IN_STEREO
int size = 采样率 x 位宽 x 采样时间 x 通道数
采样时间一般取 2.5ms~120ms 之间,由厂商或者具体的应用决定,我们其实可以推断,每一帧的采样时间取得越短,产生的延时就应该会越小,当然,碎片化的数据也就会越多。
Hal层代码实现原理:
要先open input:在audio_hw_device中有open_input_stream函数指针
open_input_stream返回一个audio_stream_in结构体,它是向上提供的"录制接口"
audio_stream_in也需要厂家提供的代码才能实现,厂家提供的代码抽象为AudioStreamInALSA对象
/** audio_stream_in implementation **/
183static uint32_t in_get_sample_rate(const struct audio_stream *stream)
184{
185 ALOGV("in_get_sample_rate");
186 return 8000;
187}
188
189static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
190{
191 ALOGV("in_set_sample_rate: %d", rate);
192 return -ENOSYS;
193}
194
195static size_t in_get_buffer_size(const struct audio_stream *stream)
196{
197 ALOGV("in_get_buffer_size: %d", 320);
198 return 320;
199}
200
201static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
202{
203 ALOGV("in_get_channels: %d", AUDIO_CHANNEL_IN_MONO);
204 return AUDIO_CHANNEL_IN_MONO;
205}
206
207static audio_format_t in_get_format(const struct audio_stream *stream)
208{
209 return AUDIO_FORMAT_PCM_16_BIT;
210}
ffmpeg 工具转换pcm
ffmpeg -i input.m4a -acodec pcm_s16le -ac 1 -ar 16000 output.pcm