1

我已经像这样设置了 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();
}

正如我所期望的那样,样本通过扬声器播放。当我插入耳机时,扬声器关闭,但声音来自手机的听筒而不是耳机。如何通过耳机播放?

4

1 回答 1

1

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

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

于 2013-05-20T09:14:14.297 回答