我是靠谱客的博主 老实网络,最近开发中收集的这篇文章主要介绍Mic Android 8.1 方案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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}
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}
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}
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}
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

虚拟Mic的主要问题,是声音同步问题,在数据和时间上不对,就容易出现声音串的问题。为了调试方便,当时用的eng debug调试版本,结果很容易出现串音,后面编译user版本,就没有了问题;代码流程一样,出问题时,可以从log,看到明显时间的错乱,但一时也查不出原因。

最后

以上就是老实网络为你收集整理的Mic Android 8.1 方案的全部内容,希望文章能够帮你解决Mic Android 8.1 方案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部