Android audio设置投屏和喇叭双输出

业务场景:

在 Android13 平台上,使用 USB 投屏工具scrcpy,投屏到电脑端时,声音被截到 电脑端播放,Android设备 端静音,在Android11及之前都是 在Android设备端正常播放。

分析:

scrcpy 支持 Android11以上版本的工具。投屏时有设置设备端AudioSource.REMOTE_SUBMIX属性,音频输出设备是 AUDIO_DEVICE_OUT_REMOTE_SUBMIX 

音频设备输出选择源码中在 Engine.cpp中

frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
    
    case STRATEGY_MEDIA: {
        DeviceVector devices2;
        if (strategy != STRATEGY_SONIFICATION) {
            // no sonification on remote submix (e.g. WFD)
            sp<DeviceDescriptor> remoteSubmix;
            if ((remoteSubmix = availableOutputDevices.getDevice(
                    AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0"),
                    AUDIO_FORMAT_DEFAULT)) != nullptr) {
                devices2.add(remoteSubmix);
            }
        }

若项目需要投屏时喇叭也正常播放,需要修改此处为

    case STRATEGY_MEDIA: {
        DeviceVector devices2;
        if (strategy != STRATEGY_SONIFICATION) {
            // no sonification on remote submix (e.g. WFD)
            sp<DeviceDescriptor> remoteSubmix;
            if ((remoteSubmix = availableOutputDevices.getDevice(
                    AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0"),
                    AUDIO_FORMAT_DEFAULT)) != nullptr) {

                    //需要在这里添加 SPEAKER 输出设备
					devices2 = availableOutputDevices.getDevicesFromTypes({
                        AUDIO_DEVICE_OUT_REMOTE_SUBMIX, AUDIO_DEVICE_OUT_SPEAKER});
            }
        }

至此,声音即可从电脑播放,Android设备喇叭本身也可正常播放。

注:

Android10 以下版本参考:

修改前:

frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp

if(mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
       device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
}

修改后:

if (mAvailableOutputDevices.getDevice(AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {
       device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;
                               
       device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
                               
       device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);
} 

也就是说 device2的获取方式有点差异。

相关推荐

  1. Android audio设置喇叭输出

    2023-12-16 21:28:04       55 阅读
  2. AirServer软件

    2023-12-16 21:28:04       11 阅读
  3. 手机到电脑

    2023-12-16 21:28:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-16 21:28:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-16 21:28:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-16 21:28:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-16 21:28:04       20 阅读

热门阅读

  1. 2276. 统计区间中的整数数目

    2023-12-16 21:28:04       38 阅读
  2. C++改写为C

    2023-12-16 21:28:04       39 阅读
  3. JVM源码剖析之信号处理机制

    2023-12-16 21:28:04       24 阅读
  4. Ubuntu 命令行安装 Clang 16或者Clang 17的过程

    2023-12-16 21:28:04       38 阅读
  5. js-正则表达式

    2023-12-16 21:28:04       25 阅读
  6. 学习软件测试建议看些什么书?

    2023-12-16 21:28:04       31 阅读
  7. Ceph入门到精通-Ceph Pacific 版本磁盘预测模块

    2023-12-16 21:28:04       30 阅读