【问题标题】:Unable to change audio source in NDK oboe LiveEffect sample code无法更改 NDK 双簧管 LiveEffect 示例代码中的音频源
【发布时间】:2020-06-05 15:30:57
【问题描述】:

我已经从这里下载了基于 Oboe 库的 LiveEffect 示例代码:https://github.com/google/oboe/tree/master/samples/LiveEffect

我已经能够在装有 Android 8.0 的三星 Galaxy S7 上构建和运行它

在为 NDK 选择 AAudio 库时,程序按预期工作,但在选择 OpenSL ES 库时,音频始终采用默认路由。我想将手机的内置麦克风作为音频输入,同时将带有麦克风的外部耳机的扬声器作为输出,但是如果连接了耳机麦克风,即使我选择了手机内置麦克风,音频输入也始终默认为耳机麦克风在应用程序的用户界面中。在仅支持 OpenSL ES 的搭载 Android 7 的三星 Galaxy S6 中也可以看到同样的行为。

我也没有找到如何在基于 Google NDK 的audio-echo sample program 中更改音频输入的方法,它也使用 OpenSL Es。使用基于 OpenSL ES 的 NDK 音频时如何指定音频输入源?这是一个错误吗?

【问题讨论】:

    标签: android audio android-ndk oboe


    【解决方案1】:

    LiveEffect 示例使用setDeviceId 指定要使用的音频设备。这是the docs 代表setDeviceId

    请注意,当使用 OpenSL ES 时,这将被忽略,并且创建的流将具有 deviceId kUnspecified。

    很遗憾,OpenSL ES(非常旧)不支持指定音频设备。这意味着将始终使用默认音频设备。

    您可以通过使用 Java API 来实现您正在寻找的行为,特别是 setPreferredDevice

    【讨论】:

    • 我尝试在使用 OpenSL ES 的 NDK 音频回声​​示例项目 (github.com/android/ndk-samples/tree/master/audio-echo) 中创建的 AudioRecord 对象上使用 setPreferredDevice,但它不起作用。所有的音频捕获和播放都来自 NDK,所以我想这就是为什么 sinplyt 在 java 中创建 AudioRecord 对象并指定首选设备没有做任何事情,所以我想它也不会在这里工作
    • FullDuplexStream.cpp 中的 onAudioReady() 函数是 Oboe 示例中的回调函数吗?较旧的音频回声项目在其回调函数中有一个函数调用 engine.delayEffect->process(...),并且音频样本的确切数量,等于 java 中指定的帧大小,曾经在名为 liveAudio[] 的数组。这个变量的双簧管等价物是什么?你对此有什么想法吗? onAudioReady() 里面有一个 numFrames 可用,但它每次都在变化,而我已经从 Java 代码中将缓冲区大小固定为 192
    • 请为此提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2015-07-30
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多