簡體   English   中英

Exoplayer:如何通過耳機播放音頻?

[英]Exoplayer: How to play audio through ear piece?

當設備接近任何 object 時,我目前正在使用以下代碼將音頻 stream 切換到耳機:

@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 output stream 可以立即更改:

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

有什么辦法可以改變 ExoPlayer 的 output stream?

為了更改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了解更多信息

通過聽筒播放

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);

在 exoPlayer 中,我通過以下方式解決了這個問題:使用此 function 將揚聲器更改為聽筒

audioPlayer.setAudioStreamType(C.STREAM_TYPE_VOICE_CALL);

反之亦然(使用電話揚聲器)

audioPlayer.setAudioStreamType(C.STREAM_TYPE_MUSIC);

但是在較新版本的 exoPlayer 中,這個 function 已被刪除。 而不是使用這個:

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)
}

最后調用 function:

setAttributes(C.STREAM_TYPE_VOICE_CALL)

或者

setAttributes(C.STREAM_TYPE_MUSIC)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM