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

文章讲述了在Android13上使用scrcpy进行投屏时,如何解决声音被截取到电脑端的问题。通过修改AudioSource设置,将输出设备改为SPEAKER,确保手机喇叭正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景:

在 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的获取方式有点差异。

Android中配置喇叭耳机同时输出声音,可以通过以下几种方法实现: 1. **使用AudioManager**: 通过AudioManager类可以控制音频的路由音量。可以通过调用`setSpeakerphoneOn(true)`方法来启用扬声器,同时通过`setMode(AudioManager.MODE_IN_COMMUNICATION)`来设置音频模式。 2. **使用AudioTrack**: AudioTrack类可以用于播放音频流。通过设置音频流类型音频播放模式,可以实现同时输出喇叭耳机。 3. **使用MediaPlayer**: MediaPlayer类可以用于播放音频文件。通过设置音频流类型音频播放模式,可以实现同时输出喇叭耳机。 以下是一个使用AudioManager的示例代码: ```java import android.content.Context; import android.media.AudioManager; public class AudioOutputManager { private AudioManager audioManager; public AudioOutputManager(Context context) { audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); } public void enableSpeakerAndHeadphone() { // 启用扬声器 audioManager.setSpeakerphoneOn(true); // 设置音频模式为通讯模式 audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); } public void disableSpeakerAndHeadphone() { // 禁用扬声器 audioManager.setSpeakerphoneOn(false); // 设置音频模式为正常模式 audioManager.setMode(AudioManager.MODE_NORMAL); } } ``` 在上述代码中,`enableSpeakerAndHeadphone`方法用于启用扬声器耳机输出,`disableSpeakerAndHeadphone`方法用于禁用扬声器耳机输出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值