Mute audio on ExoPlayer
Asked Answered
C

9

50

I'm using Google new MediaPlayer named ExoPlayer and cannot find a way to mute the sound

Is there an easy way to mute audio track on Google ExoPlayer ? Or changing volume ?

Cherida answered 10/12, 2014 at 15:13 Comment(1)
player.volume = 0fHoenack
C
67

Exoplayer 2.x.x

Get the current volume: int currentvolume = player.getVolume();
Mute: player.setVolume(0f);
Unmute: player.setVolume(currentVolume);


Exoplayer 1.x.x

I found two ways to achieve it by editing DemoPlayer from ExoPlayer.

Good one :

Basicly, you need to get the audioTrackRenderer which is a ExoPlayerComponent and send message to it. So :

  1. Add audioRenderer member and set it in onRenderers:

    // Complete preparation.  
    this.videoRenderer = renderers[TYPE_VIDEO];  
    this.audioRenderer = renderers[TYPE_AUDIO];  
    
  2. Add public method :

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

Usage :
mute : player.setMute(true);
unmute : player.setMute(false);

The other one :

This is not a good solution has the player will need to rebuffer when unmuting.
Consist of changing the audio track to an empty one:

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

// Unmute
player.selectTrack(FullPlayer.TYPE_AUDIO, ExoPlayer.TRACK_DEFAULT);
Cherida answered 10/12, 2014 at 15:13 Comment(7)
Great solution! I was using "selectTrack" way but the video stream rebuffed every time I selected different audio track.Durkheim
In ExoPlayer 2.5 you can do the track selection solution. "In ExoPlayer 2.5 this rebuffering has been eliminated, allowing audio and text track selections to be made in a seamless way." medium.com/google-exoplayer/…Wallow
Is it possible for the ExoPlayer to play something at a volume that is independent from any system volume level?Wherewith
@androiddeveloper I doubt that this is not an expected behavior for the User. As stated in the doc: 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/…Cherida
@HugoGresse Sometimes it's important to play a sound that the user will hear. I wanted to avoid changing global volume levels just for that.Wherewith
probably worth another stackoverflow search like #4071649Cherida
There is a problem when an incoming call occurs, on some devices volume restores to default but ExoPlayer tells me volume is zero, which is false. github.com/google/ExoPlayer/issues/3923Invade
G
26

The new way to mute and unmute volume as of version 2.X.X done as follows:

int currentvolume = player.getVolume();

make sure to call the line above after starting the player otherwise you will get a nullpointerexception

to mute volume:

player.setVolume(0f);

to unmute volume:

player.setVolume(currentVolume);
Glenglencoe answered 27/4, 2017 at 7:52 Comment(1)
nice and simple!Epsilon
A
11

Easily you can do it with ExoPlayer:

Java Code:

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

Kotlin Code:

val curentVol = player?.volume
if (curentVol == 0f) {
     player?.volume = 1f
} else {
     player?.volume = 0f
}
Armorer answered 28/5, 2020 at 11:9 Comment(0)
M
5

In ExoPlayer 2.x.x:

get the current volume:

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

mute:

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

unmute:

player.getAudioComponent().setVolume(currentVolume);
Miniaturist answered 4/8, 2019 at 12:12 Comment(0)
O
4

I will recommend get the current volume first and then mute it. When you will unmute you can give user same volume.

float currentvolume;
currentvolume = player.getVolume();
player.setVolume(0.0f);
Obstruction answered 18/9, 2018 at 21:23 Comment(0)
B
2

try

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

analogous to this line of code

Bobwhite answered 17/6, 2016 at 7:11 Comment(3)
which is exactly the same as player.selectTrack(FullPlayer.TYPE_AUDIO, -1); with ExoPlayer.TRACK_DEFAULT. This is totaly not a good solution as unmuting the sound will have major delayCherida
exactly the same but different. Anyway there are situations in which you want to completely disable the audio track (e.g. testing purpose)Bobwhite
it's exactly my second case in the accepted answer 'The other one"Cherida
C
2

Just simply use player.setVolume(0) will silent the video.

Copolymerize answered 10/9, 2018 at 10:2 Comment(0)
A
2

Returns the audio volume, with 0 being silence and 1 being unity gain (signal unchanged).

You should use new version: implementation 'com.google.android.exoplayer:exoplayer:2.18.5'

  • Mute volume:
    exoPlayer.volume = 0f    
  • Unmute volume value:
    exoPlayer.volume = 1f   
Ambiversion answered 17/4, 2023 at 8:44 Comment(0)
C
0

Mute ExoPlayer using Kotlin

player.audioComponent?.volume = 0f
Cautious answered 2/2, 2021 at 15:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.