【问题标题】:Playing 2 musics through 2 different sound cards at same time同时通过 2 个不同的声卡播放 2 首音乐
【发布时间】:2018-09-02 16:28:43
【问题描述】:

尝试一些开箱即用的东西...我有一个简单的应用程序,带有一个按钮,当按下该按钮时,会从我的 android 平板电脑的音频插孔中播放音乐。

public void btn1 (View view) {
    MediaPlayer mp = MediaPlayer.create(this, R.raw.xxx);
    mp.start();
}

我现在添加了一个 USB 音频接口(通过一个微型 USB 适配器),我可以从中听到音频。

我可以用这个列出声卡

AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);

for (AudioDeviceInfo device : devices) {
    int b = device.getId();
    int d = device.getType();
    CharSequence productName = device.getProductName();
}

如何路由音乐,以便一次播放 2 种不同的音乐,一种通过 USB 播放,另一种通过耳机插孔播放?

【问题讨论】:

    标签: java android audio usb soundcard


    【解决方案1】:

    根据MediaPlayer 文档,您可以使用setPreferredDevice 设置音频设备,它接收AudioDeviceInfo 作为参数,请参阅https://developer.android.com/reference/android/media/MediaPlayer.html#setPreferredDevice(android.media.AudioDeviceInfo)

    然后您必须创建一个MediaPlayer 才能在每台设备上播放。

    【讨论】:

    • setPreferredDevice 是在API 28中添加的。
    【解决方案2】:

    它的工作原理是这样的:

    protected void playAudio() {
        this.playByDeviceIdx(0, R.raw.xxx);
        this.playByDeviceIdx(1, R.raw.yyy);
    }
    
    protected void playByDeviceIdx(int deviceIndex, @IdRes int resId) {
    
        /* obtain audio-output device-infos */
        deviceInfos[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
    
        /* check, if the desired index is even within bounds */
        if(deviceInfos.length < deviceIndex) {
    
            /* create an instance of MediaPlayer */
            MediaPlayer mp = MediaPlayer.create(this, resId);
    
            /* assign a preferred device to the MediaPlayer instance */
            mp.setPreferredDevice(deviceInfos[deviceIndex]);
    
           /* start the playback (only if a device exists at the index) */
           mp.start();
        }
    }
    

    您还可以过滤耳机插孔插入/拔出事件:

    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
    Intent intent = context.registerReceiver(null, intentFilter);
    boolean isConnected = intent.getIntExtra("state", 0) == 1;
    

    来源:me,基于 MediaPlayer 的 SDK 文档。

    【讨论】:

    • setPreferredDevice 是在 API 28 中添加的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多