android - AudioTrack 不通过耳机播放

标签 android

我已经像这样设置了一个 AudioTrack:

public NoiseThread(byte[] data)
{
    rawData = data; 
    bufferSize = 2* AudioTrack.getMinBufferSize (44000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT);

    track = new AudioTrack(AudioManager.STREAM_MUSIC, 44000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize, AudioTrack.MODE_STREAM);
    track.setStereoVolume(volume, volume);
}

public void run() {         
    setPriority(MAX_PRIORITY);

    track.play();
    while(!isInterrupted()){
        track.write(rawData, 0, bufferSize);
    }
    track.stop();
}

样本如我所料通过扬声器播放。当我插入耳机时,扬声器关闭,但声音是从手机听筒而不是耳机发出的。如何通过耳机播放?

最佳答案

许多 Android 设备在 AudioFlinger/音频 HAL 中使用单个输出线程进行所有本地播放(听筒、扬声器、有线耳机/耳机),使得两个音轨的不同路由不可能同时进行(这就是为什么在许多设备上媒体流如果播放通知并且您连接了有线耳机,则强制静音;否则您会在播放通知时听到扬声器中的音乐)。

在某些设备上,如果您设法执行 setForceUse(FOR_MEDIA, FORCE_SPEAKER) 并将 MUSIC 流类型用于您想要播放的内容,则可能会执行您正在寻找的内容在扬声器中,以及要在有线耳机中播放的内容的 VOICE_CALL 流类型。 我不确定应用程序是否有任何方法可以执行该 setForceUse 调用。也许您可以通过反射获取 AudioService 类的 handleMessage 方法并向其发送 MSG_SET_FORCE_USE 消息。我自己从未尝试过,所以它可能会惨败。

关于android - AudioTrack 不通过耳机播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646136/

相关文章:

android - 抽屉布局 subview 重叠

android - 从本地文件系统加载 google-services.json

android - 从 PendingIntent(通知按钮)启动 JobIntentService?

android - 在 edittext 提示中需要水平滚动

android - 抽屉导航不适用于导航组件

android - 如何解决 Android NDK 构建命令失败的问题?

android - 使用 XML 中的 "animateLayoutChanges"属性对布局进行动画处理

java - libgdx - gameoverscreen 不会显示

java - 如何在对话框中创建动态布局

java - 投递箱 API : how can I get the amount of remaining free space?