安卓模拟器音频输入捕获

3
我想开发一个安卓应用程序,可以捕捉周围的音频(就像录音机一样,不仅仅是用户的声音,而是任何音频)。因此,我正在寻找一种使用安卓模拟器(任何免费的安卓模拟器)测试这个应用程序的方法。
我在这个问题上找到了很多问题,但没有真正的答案:
安卓的音频捕捉文档告诉我这是不可能的:
注意:安卓模拟器没有捕捉音频的功能,但实际设备很可能提供这些功能。 这个SO问题的答案告诉我可以通过某些AVD配置实现:
您需要向模拟器(Android SDK和AVD管理器->虚拟设备->编辑->硬件->新建)添加音频录制+播放支持。

但是我不知道在哪里找到这些“虚拟设备 -> ...”菜单选项(或类似的选项),我甚至认为它们在当前的AVD管理器和SDK管理器中已经不存在了。


这个 SO上的答案告诉我,这是可能的,但只有在使用非常特定的AudioRecorder配置时才能实现。

所有这些建议似乎都来自至少2年前,所以我猜它们不是最新的。我知道我可以使用真实设备,但目前没有一个,而且那只会涵盖应用程序在一个特定设备上的一个Android版本的行为。我需要比那更多的测试。

是否有可能在模拟器上测试和调试音频捕获应用程序?
是否有一种方法可以在模拟器上捕获音频输入(也许使用标准模拟器之外的其他模拟器)?
我是否可以以某种方式将来自连接到我的PC的麦克风、扬声器或直接来自音频文件(例如mp3)的输入转发?

我正在使用Windows 8.1和Android Studio 1.2.2

2个回答

1
是的,这是可能的。只需使用AudioRecord(或其他)开始录制即可,但在某些情况下(取决于模拟器中使用的系统映像),仅能以每秒8000个样本的速度进行录制。
例如,当我在模拟器中使用Lollipop映像时,可以按声明的速率(44100)录制,尽管听起来像是重新采样。当使用Kitkat或更低版本的映像时,仅能以8000sps的速度录制。

1

就像其他人说的那样,这是可能的。截至Android Studio 2.2.3,您不需要上面列出的任何信息。它应该可以正常工作...假设您匹配我正在使用的设置。 我当前正在使用的设置:

  • Ubuntu 16.04
  • OpenSL ES
  • 仿真器设置
    • KVM
    • Google APIs
    • Nexus 6P硬件配置文件
    • 可工作且经过测试的API版本
      • 23
      • 24

这是我如何实例化OpenSL ES播放实例的方法:

  // Set-up audio source.
  SLDataLocator_AndroidSimpleBufferQueue lDataLocatorIn = {
    SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, BUFFER_COUNT
  };
  SLDataFormat_PCM lDataFormat = {
    SL_DATAFORMAT_PCM,
    1, // numChannels
    SL_SAMPLINGRATE_11_025 / 1000, // sample rate here
    SL_PCMSAMPLEFORMAT_FIXED_16, // bitsPerSample
    16, // containerSize
    SL_SPEAKER_FRONT_CENTER, // channelMask
    SL_BYTEORDER_LITTLEENDIAN
  };
  SLDataSource lDataSource = { &lDataLocatorIn, &lDataFormat };

  SLDataLocator_OutputMix lDataLocatorOut = {
    SL_DATALOCATOR_OUTPUTMIX,
    outputObj_
  };
  SLDataSink lDataSink = {
    &lDataLocatorOut,
    NULL
  };

由于某种原因,API 25模拟器不支持11025样本率(出现状态-22的错误……这个日志行发生在AudioRecord中,它是另一个我没有直接使用的Android API)。我甚至无法理解为什么会这样,但目前我正在调查它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接