【问题标题】:Mute audio on ExoPlayerExoPlayer 静音
【发布时间】:2015-02-08 20:24:42
【问题描述】:

我正在使用名为 ExoPlayer 的 Google 新 MediaPlayer,但找不到静音的方法

有没有一种简单的方法可以在 Google ExoPlayer 上将音轨静音?还是改变音量?

【问题讨论】:

  • player.volume = 0f

标签: android exoplayer


【解决方案1】:

Exoplayer 2.x.x

获取当前音量: int currentvolume = player.getVolume();
静音: player.setVolume(0f);
取消静音: player.setVolume(currentVolume);


Exoplayer 1.x.x

我找到了两种方法来实现它,从 ExoPlayer 编辑 DemoPlayer

好一个:

基本上,您需要获取audioTrackRenderer(即ExoPlayerComponent)并向其发送消息。 所以:

  1. 添加audioRenderer成员并设置在onRenderers中:

    // Complete preparation.  
    this.videoRenderer = renderers[TYPE_VIDEO];  
    this.audioRenderer = renderers[TYPE_AUDIO];  
    
  2. 添加公共方法:

    public void setMute(boolean toMute){
        if(toMute){
            player.sendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME, 0f);
        } else {
            player.sendMessage(audioRenderer, MediaCodecAudioTrackRenderer.MSG_SET_VOLUME, 1f);
        }
    }
    

用法:
静音:player.setMute(true);
取消静音:player.setMute(false);

另一个:

这不是一个好的解决方案,玩家在取消静音时需要重新缓冲。
包括将音轨更改为空音轨:

// mute
player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DISABLED);

// Unmute
player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DEFAULT);

【讨论】:

  • 很好的解决方案!我使用的是“selectTrack”方式,但每次我选择不同的音轨时,视频流都会被拒绝。
  • 在 ExoPlayer 2.5 中,您可以进行曲目选择解决方案。 “在 ExoPlayer 2.5 中,这种重新缓冲已被消除,允许以无缝方式进行音频和文本轨道选择。” medium.com/google-exoplayer/…
  • ExoPlayer 是否可以以独立于任何系统音量级别的音量播放某些内容?
  • @androiddeveloper 我怀疑这不是用户的预期行为。如文档中所述:Android uses separate audio streams for playing music, alarms, notifications, the incoming call ringer, system sounds, in-call volume, and DTMF tones. This allows users to control the volume of each stream independently. Plus:Unless your app is an alarm clock, you should play audio using the STREAM_MUSIC stream. Ref:developer.android.com/guide/topics/media-apps/…
  • @HugoGresse 有时播放用户会听到的声音很重要。我想避免仅仅为此改变全球音量水平。
【解决方案2】:

从 2.3.1 版本开始,静音和取消静音的新方法可以按如下方式完成:

int currentvolume = player.getVolume();

请确保在启动播放器后调用上述代码行,否则您将收到空指针异常

静音:

player.setVolume(0f);

取消静音:

player.setVolume(currentVolume);

【讨论】:

  • 又好又简单!
【解决方案3】:

您可以使用 ExoPlayer 轻松完成:

Java 代码:

float currentVolume = player.getVolume();
if (currentVolume == 0f) {
      player.setVolume(1f);
} else {
      player.setVolume(0f);
}

Kotlin 代码:

val curentVol = player?.volume
if (curentVol == 0f) {
     player?.volume = 1f
} else {
     player?.volume = 0f
}

【讨论】:

    【解决方案4】:

    在 ExoPlayer 2.x.x 中:

    获取当前音量:

    int currentVolume = player..getAudioComponent().getVolume();
    

    静音:

    player.getAudioComponent().setVolume(0f);
    

    取消静音:

    player.getAudioComponent().setVolume(currentVolume);
    

    【讨论】:

      【解决方案5】:

      试试

      player.setSelectedTrack(DemoPlayer.TYPE_AUDIO, DemoPlayer.TRACK_DISABLED);
      

      类似于this line of code

      【讨论】:

      • 这与player.selectTrack(FullPlayer.TYPE_AUDIO, -1);ExoPlayer.TRACK_DEFAULT 完全相同。这完全不是一个好的解决方案,因为取消静音会产生很大的延迟
      • 完全相同但不同。无论如何,在某些情况下您想完全禁用音轨(例如测试目的)
      • 这正是我接受的答案“另一个”中的第二个案例
      【解决方案6】:

      只需简单地使用 player.setVolume(0) 即可使视频静音。

      【讨论】:

        【解决方案7】:

        我建议先获取当前音量,然后再静音。当您取消静音时,您可以为用户提供相同的音量。

        float currentvolume;
        currentvolume = player.getVolume();
        player.setVolume(0.0f);
        

        【讨论】:

          【解决方案8】:

          使用 Kotlin 静音 ExoPlayer

          player.audioComponent?.volume = 0f
          

          【讨论】:

            猜你喜欢
            • 2019-03-30
            • 2021-08-27
            • 1970-01-01
            • 2017-02-18
            • 2018-04-02
            • 2021-08-11
            • 2020-02-29
            • 1970-01-01
            • 2019-05-15
            相关资源
            最近更新 更多