How to add Adaptive Track Selector in Exo-player v2.x?
I'm setting up Exo Player in my app and I have implemented DASH adaptive streaming in my player, and want to add the functionality to play the track of specific quality selected by the user.
My Exo player version is 2.9.3
, I tried implementing by following these Stackoverflow Post,Medium Post, but it's bit confusing and some part of the code is deprecated, and saying the truth is that I am a beginner.
Here's my code for initializing the player:-
private void initializePlayer() {
if (player == null) {
bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new PlayerTrackSelector(bandwidthMeter);
trackSelector = new DefaultTrackSelector(factory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
player.addVideoListener(this);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
player.addListener(this);
playerView.setPlayer(player);
}
MediaSource mediaSource = buildMediaSource(Uri.parse("http://192.168.43.238:3000/storage/video-dash/9e351142a4eb1664643bf93ba13959e8.mpd"));
player.prepare(mediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
And the TrackSelector
Class:-
public class PlayerTrackSelector implements TrackSelection.Factory {
private BandwidthMeter bandwidthMeter;
public PlayerTrackSelector(BandwidthMeter bandwidthMeter) {
this.bandwidthMeter = bandwidthMeter;
}
@Override
public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) {
return new AdaptiveTrackSelection(group,tracks,bandwidthMeter,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
Clock.DEFAULT);
}
}
I expect to get a list of available quality types and let the user select one of them and play the rest of the content with the selected type, this question is maybe broad but please guide me a little.
java android exoplayer mpeg-dash exoplayer2.x
add a comment |
I'm setting up Exo Player in my app and I have implemented DASH adaptive streaming in my player, and want to add the functionality to play the track of specific quality selected by the user.
My Exo player version is 2.9.3
, I tried implementing by following these Stackoverflow Post,Medium Post, but it's bit confusing and some part of the code is deprecated, and saying the truth is that I am a beginner.
Here's my code for initializing the player:-
private void initializePlayer() {
if (player == null) {
bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new PlayerTrackSelector(bandwidthMeter);
trackSelector = new DefaultTrackSelector(factory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
player.addVideoListener(this);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
player.addListener(this);
playerView.setPlayer(player);
}
MediaSource mediaSource = buildMediaSource(Uri.parse("http://192.168.43.238:3000/storage/video-dash/9e351142a4eb1664643bf93ba13959e8.mpd"));
player.prepare(mediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
And the TrackSelector
Class:-
public class PlayerTrackSelector implements TrackSelection.Factory {
private BandwidthMeter bandwidthMeter;
public PlayerTrackSelector(BandwidthMeter bandwidthMeter) {
this.bandwidthMeter = bandwidthMeter;
}
@Override
public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) {
return new AdaptiveTrackSelection(group,tracks,bandwidthMeter,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
Clock.DEFAULT);
}
}
I expect to get a list of available quality types and let the user select one of them and play the rest of the content with the selected type, this question is maybe broad but please guide me a little.
java android exoplayer mpeg-dash exoplayer2.x
add a comment |
I'm setting up Exo Player in my app and I have implemented DASH adaptive streaming in my player, and want to add the functionality to play the track of specific quality selected by the user.
My Exo player version is 2.9.3
, I tried implementing by following these Stackoverflow Post,Medium Post, but it's bit confusing and some part of the code is deprecated, and saying the truth is that I am a beginner.
Here's my code for initializing the player:-
private void initializePlayer() {
if (player == null) {
bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new PlayerTrackSelector(bandwidthMeter);
trackSelector = new DefaultTrackSelector(factory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
player.addVideoListener(this);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
player.addListener(this);
playerView.setPlayer(player);
}
MediaSource mediaSource = buildMediaSource(Uri.parse("http://192.168.43.238:3000/storage/video-dash/9e351142a4eb1664643bf93ba13959e8.mpd"));
player.prepare(mediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
And the TrackSelector
Class:-
public class PlayerTrackSelector implements TrackSelection.Factory {
private BandwidthMeter bandwidthMeter;
public PlayerTrackSelector(BandwidthMeter bandwidthMeter) {
this.bandwidthMeter = bandwidthMeter;
}
@Override
public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) {
return new AdaptiveTrackSelection(group,tracks,bandwidthMeter,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
Clock.DEFAULT);
}
}
I expect to get a list of available quality types and let the user select one of them and play the rest of the content with the selected type, this question is maybe broad but please guide me a little.
java android exoplayer mpeg-dash exoplayer2.x
I'm setting up Exo Player in my app and I have implemented DASH adaptive streaming in my player, and want to add the functionality to play the track of specific quality selected by the user.
My Exo player version is 2.9.3
, I tried implementing by following these Stackoverflow Post,Medium Post, but it's bit confusing and some part of the code is deprecated, and saying the truth is that I am a beginner.
Here's my code for initializing the player:-
private void initializePlayer() {
if (player == null) {
bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new PlayerTrackSelector(bandwidthMeter);
trackSelector = new DefaultTrackSelector(factory);
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
player.addVideoListener(this);
playerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
player.addListener(this);
playerView.setPlayer(player);
}
MediaSource mediaSource = buildMediaSource(Uri.parse("http://192.168.43.238:3000/storage/video-dash/9e351142a4eb1664643bf93ba13959e8.mpd"));
player.prepare(mediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
}
And the TrackSelector
Class:-
public class PlayerTrackSelector implements TrackSelection.Factory {
private BandwidthMeter bandwidthMeter;
public PlayerTrackSelector(BandwidthMeter bandwidthMeter) {
this.bandwidthMeter = bandwidthMeter;
}
@Override
public TrackSelection createTrackSelection(TrackGroup group, BandwidthMeter bandwidthMeter, int... tracks) {
return new AdaptiveTrackSelection(group,tracks,bandwidthMeter,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS,
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
Clock.DEFAULT);
}
}
I expect to get a list of available quality types and let the user select one of them and play the rest of the content with the selected type, this question is maybe broad but please guide me a little.
java android exoplayer mpeg-dash exoplayer2.x
java android exoplayer mpeg-dash exoplayer2.x
edited Jan 1 at 17:40
Shashank Mishra
asked Jan 1 at 17:32
Shashank MishraShashank Mishra
187
187
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Try following code. Call following code when you need to show list. rendererIndex -> You can try manually. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.
UPDATED:
MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
int rendererIndex = 2;
int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
boolean allowAdaptiveSelections =
rendererType == C.TRACK_TYPE_VIDEO
|| (rendererType == C.TRACK_TYPE_AUDIO
&& mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
Pair<AlertDialog, TrackSelectionView> dialogPair =
TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
dialogPair.second.setShowDisableOption(true);
dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
dialogPair.first.show();
}
What isrendererIndex
?
– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using2
shows onlyauto
andnone
, so I used 0 which is the default option then it works perfectly, what is the reason for following?
– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997516%2fhow-to-add-adaptive-track-selector-in-exo-player-v2-x%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try following code. Call following code when you need to show list. rendererIndex -> You can try manually. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.
UPDATED:
MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
int rendererIndex = 2;
int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
boolean allowAdaptiveSelections =
rendererType == C.TRACK_TYPE_VIDEO
|| (rendererType == C.TRACK_TYPE_AUDIO
&& mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
Pair<AlertDialog, TrackSelectionView> dialogPair =
TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
dialogPair.second.setShowDisableOption(true);
dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
dialogPair.first.show();
}
What isrendererIndex
?
– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using2
shows onlyauto
andnone
, so I used 0 which is the default option then it works perfectly, what is the reason for following?
– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
add a comment |
Try following code. Call following code when you need to show list. rendererIndex -> You can try manually. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.
UPDATED:
MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
int rendererIndex = 2;
int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
boolean allowAdaptiveSelections =
rendererType == C.TRACK_TYPE_VIDEO
|| (rendererType == C.TRACK_TYPE_AUDIO
&& mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
Pair<AlertDialog, TrackSelectionView> dialogPair =
TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
dialogPair.second.setShowDisableOption(true);
dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
dialogPair.first.show();
}
What isrendererIndex
?
– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using2
shows onlyauto
andnone
, so I used 0 which is the default option then it works perfectly, what is the reason for following?
– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
add a comment |
Try following code. Call following code when you need to show list. rendererIndex -> You can try manually. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.
UPDATED:
MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
int rendererIndex = 2;
int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
boolean allowAdaptiveSelections =
rendererType == C.TRACK_TYPE_VIDEO
|| (rendererType == C.TRACK_TYPE_AUDIO
&& mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
Pair<AlertDialog, TrackSelectionView> dialogPair =
TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
dialogPair.second.setShowDisableOption(true);
dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
dialogPair.first.show();
}
Try following code. Call following code when you need to show list. rendererIndex -> You can try manually. TRACK_TYPE_AUDIO = 1, TRACK_TYPE_VIDEO = 2.
UPDATED:
MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo != null) {
int rendererIndex = 2;
int rendererType = mappedTrackInfo.getRendererType(rendererIndex);
boolean allowAdaptiveSelections =
rendererType == C.TRACK_TYPE_VIDEO
|| (rendererType == C.TRACK_TYPE_AUDIO
&& mappedTrackInfo.getTypeSupport(C.TRACK_TYPE_VIDEO)
== MappingTrackSelector.MappedTrackInfo.RENDERER_SUPPORT_NO_TRACKS);
Pair<AlertDialog, TrackSelectionView> dialogPair =
TrackSelectionView.getDialog(xxxxxxxxxxxxxx.this, "Track Selector", trackSelector, rendererIndex);
dialogPair.second.setShowDisableOption(true);
dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
dialogPair.first.show();
}
edited Jan 2 at 6:55
answered Jan 2 at 0:41
user1732369user1732369
11614
11614
What isrendererIndex
?
– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using2
shows onlyauto
andnone
, so I used 0 which is the default option then it works perfectly, what is the reason for following?
– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
add a comment |
What isrendererIndex
?
– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using2
shows onlyauto
andnone
, so I used 0 which is the default option then it works perfectly, what is the reason for following?
– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
What is
rendererIndex
?– Shashank Mishra
Jan 2 at 6:17
What is
rendererIndex
?– Shashank Mishra
Jan 2 at 6:17
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
rendererIndex = index of the tracks you want to select from. There are three types of Tracks. Audio, Video and Text (subtitle). If you don't have subtitle then normally rendererIndex is normally 2. You can try int rendererIndex = 2; to get list to video tracks.
– user1732369
Jan 2 at 6:51
using
2
shows only auto
and none
, so I used 0 which is the default option then it works perfectly, what is the reason for following?– Shashank Mishra
Jan 2 at 8:58
using
2
shows only auto
and none
, so I used 0 which is the default option then it works perfectly, what is the reason for following?– Shashank Mishra
Jan 2 at 8:58
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
I can't tell your what tracks index is 2. Normally I find renderindex type using MappingTrackSelector. Check github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/… line 634
– user1732369
Jan 3 at 7:56
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997516%2fhow-to-add-adaptive-track-selector-in-exo-player-v2-x%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown