AudioTrack不通过耳机流式传输

时间:2013-05-20 09:11:48

标签: 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();
}

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

1 个答案:

答案 0 :(得分:1)

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

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