虚拟Mic Android 8.1 方案

虚拟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

你可能感兴趣的:(手机移动开发,android)