【问题标题】:How to get volume of AudioTrack in Android?如何在 Android 中获取 AudioTrack 的音量?
【发布时间】:2026-02-09 09:40:01
【问题描述】:

我可以使用track.setStereoVolume(a,b);设置audioTrack的音量

但我找不到获取音量的方法,例如 getStereoVolume()setOnVolumeChangedHandler(...)

如何跟踪音量?

【问题讨论】:

  • 我认为使用 AudioManager 可能是一个解决方案。有一个方法getStreamVolume(int streamType);
  • 我认为这是一个通用的覆盖函数。所以即使 AudioTrack 的音量是 0.0f,AudioManager 也可能为 getStreamVolume 返回 1.0f。不是吗?

标签: android volume audiotrack


【解决方案1】:

您无法获取音轨的左右音量。

所以我建议你创建一个代表AudioTrack 的类。

public class AudioPlayer{
    AudioTrack track;
    float leftVolume;
    float rightVolume;
    public AudioPlayer(){
        //create audio track.
        leftVolume = 1;
        rightVolume = 1;
    }
    public void setStereoVolume(float left, float right){
        this.leftVolume = left;
        this.rightVolume = right;
        track.setStereoVolume(left, right);
    }
}

当您创建AudioTrack 时,两个声道的立体声音量均为 1.0。当通过AudioPlayer 设置音量时,它会跟踪新的级别。

如果AudioTrack 完全封装在AudioPlayer 中,这将起作用。

编辑:

AudioTrack 有自己的音量级别,独立于其他音轨。 AudioTrack正在播放的流(STREAM_MUSIC、STREAM_SYSTEM 等)也会影响最终音量。

因此,假设您的AudioTrack 的左右声道为 0.5,.5,并且在 STREAM_MUSIC 上播放。如果该流的音量为 0.5,则最终音频电平将为

.5*.5 = .25 //for the left and right channels.

如果由于省电或耳机而发生某些自动音量调整 - 不管怎样,它应该发生在 Stream 级别(或隐藏在此之外的某个地方)。不过,它不应该调整您的 AudioTrack 音量。

【讨论】:

  • 感谢您的回答。如果 Android 操作系统更改了轨道音量(例如,当您插入耳机时,三星设备上的自动音量更改),这些值将不同步。
  • 我不这么认为。有多个音量级别。您的音轨将具有独立于任何其他级别的音量级别。最终级别将乘以其输出的流类型。我会详细回答。
【解决方案2】:

不是一个真正的答案,只是一个假设:直到现在我还没有测试过,但这应该可以工作。我认为您不必重写此方法。试试看

 AudioManager audioManager = (AudioManager) 
          getSystemService(AUDIO_SERVICE);

      float volume = (float) audioManager.
          getStreamVolume(AudioManager.STREAM_MUSIC);

【讨论】:

  • 问题是我只减少了 1 个音轨的音量。因此,另一个音轨的音量可能为 1.0(满)。所以 AudioManager 上的 getStreamvolume 可以设置为 1.0 或 0.5,与这些值无关。