Exoplayer:如何通过耳机播放音频?

8

我目前使用以下代码,在设备靠近任何物体时切换音频流到耳机:

@Override
public void onSensorChanged(SensorEvent event) {

    if (mAudioManager.isWiredHeadsetOn() || !(mCurrentPlaybackStatus == STATUS_PLAYING
            || mCurrentPlaybackStatus == STATUS_PREPARING)) {
        return;
    }

    boolean isClose = event.values[0] < mSensor.getMaximumRange();

    if (!mScreenDisabled && isClose) {

        mAudioManager.setMode(AudioManager.STREAM_MUSIC);
        mAudioManager.setSpeakerphoneOn(false);

        disableScreen();

        mScreenDisabled = true;

    } else if (mScreenDisabled && !isClose) {

        mAudioManager.setSpeakerphoneOn(true);
        mAudioManager.setMode(mAudioManagerMode);

        enableScreen();
        mScreenDisabled = false;
    }
}

很遗憾,在调用.setMode(AudioManager.STREAM_MUSIC);时会出现显著的延迟(> 500毫秒)。

使用Android的默认MediaPlayer,可以在没有延迟的情况下更改输出流:

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); // ear piece
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // speakerphone

有没有办法更改ExoPlayer的输出流?
3个回答

2

如果要更改ExoPlayer的流类型,您需要通过MediaCodecAudioTrackRenderer构造函数将流类型传递到(ExoPlayer的)AudioTrack构造函数中。

  public AudioTrack() {
    this(null, AudioManager.STREAM_MUSIC);   //default is STREAM_MUSIC
  }

  public AudioTrack(AudioCapabilities audioCapabilities, int streamType) {

  }

在您的应用程序中,构建渲染器时需要指定类型。

更多信息请参考https://github.com/google/ExoPlayer/issues/755


在播放过程中是否可以更改流类型? - timoschloesser
您不能在播放期间更改流类型。在早期版本的Exo Player中,仅允许使用STREAM_MUSIC。现在他们已经提供了使用不同流类型的灵活性。 - abhishesh
你可以在游戏过程中进行更改,我在下面发布了我的答案。 - Yousef Kazemi

0
在 ExoPlayer 中,我通过以下方式解决了这个问题: 使用此函数将扬声器更改为听筒
audioPlayer.setAudioStreamType(C.STREAM_TYPE_VOICE_CALL);

并且反之亦然(使用手机扬声器)

audioPlayer.setAudioStreamType(C.STREAM_TYPE_MUSIC);

但是在较新的exoPlayer版本中,此功能已被删除。请改用以下内容:

fun setAttributes(@C.StreamType streamType: Int) {
    @AudioUsage val usage = Util.getAudioUsageForStreamType(streamType)
    @AudioContentType val contentType =
        Util.getAudioContentTypeForStreamType(streamType)
    val audioAttributes =
        AudioAttributes.Builder().setUsage(usage).setContentType(contentType).build()
    audioPlayer.setAudioAttributes(audioAttributes, false)
}

最后调用该函数:
setAttributes(C.STREAM_TYPE_VOICE_CALL)

或者

setAttributes(C.STREAM_TYPE_MUSIC)

0

通过耳机播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

这与ExoPlayer无关。 - timoschloesser
@timoschloesser,如果mediaPlayer是SimpleExoPlayer的实例,则确实与ExoPlayer相关 :) https://github.com/google/ExoPlayer/blob/270f68a/library/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java#L300 - Paweł Nadolski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接