2

I would like to play my video at the lowest resolution(256x144). I have configured the DefaultTrackSelector by setting two parameters:

1.setMaxVideoSize(width, height) to limit the resolution to your parameters. 2.setForceHighestSupportedBitrate(true) to force-select the highest bitrate that is still within size constraints.

Full Code

DefaultTrackSelector trackSelector = new DefaultTrackSelector(requireContext());
            trackSelector.setParameters(trackSelector
                    .buildUponParameters()
                    .setMaxVideoSize(256, 144)
                    .setForceHighestSupportedBitrate(true));
            player = new SimpleExoPlayer.Builder(requireContext())
                    .setTrackSelector(trackSelector)
                    .build();
            player.setMediaItem(MediaItem.fromUri(videoUri));
player.setPlayWhenReady(true);
player.prepare();
playerView.setPlayer(player);

But still, it is playing video with different video resolutions. Someone, please help me to fix this issue.

Log

3314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.60, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.640028, res=1920x1080, fps=30.0]
2021-06-26 16:52:44.683 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.61, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.640028, res=1920x1080, fps=30.0]
2021-06-26 16:52:45.208 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=1.22, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.42C01E, res=480x270, fps=29.999668]
2021-06-26 16:52:45.278 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=1.27, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.42C01E, res=480x270, fps=29.999668]
2021-06-26 16:52:45.317 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=1.42, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.4D401F, res=720x720, fps=29.999668]
2021-06-26 16:52:45.590 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=1.69, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.4D401F, res=720x720, fps=29.999668]
2021-06-26 16:52:54.257 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.21, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=960x540, fps=29.999342]
2021-06-26 16:52:54.666 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.62, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=960x540, fps=29.999342]
2021-06-26 16:52:56.331 13314-13314/com.example D/EventLogger: downstreamFormat [eventTime=0.60, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=608x1080, fps=30.0]
2021-06-26 16:52:56.413 13314-13314/com.example D/EventLogger: videoInputFormat [eventTime=0.69, mediaPos=0.00, window=0, period=0, id=1, mimeType=video/avc, codecs=avc1.64001F, res=608x1080, fps=30.0]

Reference Link

https://github.com/google/ExoPlayer/issues/6756

Set max bitrate on ExoPlayer

Tushar Lathiya
  • 940
  • 9
  • 26

1 Answers1

0

First we need to check available tracks in video and during ilteration we need to store Formats & Bitrate in ArrayList.

  if(formatList!=null){formatList.clear();}
        if(bitrateList!=null){bitrateList.clear();}
        final Gson gson = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .excludeFieldsWithModifiers(TRANSIENT) // STATIC|TRANSIENT in the default configuration
                .create();
        if (trackSelector.getCurrentMappedTrackInfo() != null) {
            Log.d("TAG", "log tracks clicked");
            MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
            DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();

            for (int rendererIndex = 0; rendererIndex < mappedTrackInfo.getRendererCount(); rendererIndex++) {
                if (TrackSelectionDialog.showTabForRenderer(mappedTrackInfo, rendererIndex)) {
                    int trackType = mappedTrackInfo.getRendererType(rendererIndex);
                    TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(rendererIndex);
                    Boolean isRendererDisabled = parameters.getRendererDisabled(rendererIndex);
                    DefaultTrackSelector.SelectionOverride selectionOverride = parameters.getSelectionOverride(rendererIndex, trackGroupArray);

                    Log.d("TAG", "------------------------------------------------------Track item " + rendererIndex + "------------------------------------------------------");
                    Log.d("TAG", "track type: ");
                    Log.d("TAG", "track group array: " + gson.toJson(trackGroupArray));
                    for (int groupIndex = 0; groupIndex < trackGroupArray.length; groupIndex++) {
                        for (int trackIndex = 0; trackIndex < trackGroupArray.get(groupIndex).length; trackIndex++) {
                            TrackNameProvider trackNameProvider = new DefaultTrackNameProvider(getResources());
                            String trackName = trackNameProvider.getTrackName(trackGroupArray.get(groupIndex).getFormat(trackIndex));
                            String[] widthxheight = trackName.split(",");
                            //  Log.d("TAG", "wid" + widthxheight[0]);
                            String[] height = widthxheight[0].split("×");
                            //  Log.d("TAG", "hei" + height[0]);
                            Boolean isTrackSupported = mappedTrackInfo.getTrackSupport(rendererIndex, groupIndex, trackIndex) == RendererCapabilities.FORMAT_HANDLED;
                            Log.d("TAG", "track item " + groupIndex + ": trackName: " + trackName + ", isTrackSupported: " + isTrackSupported);
                            if(rendererIndex == 0)
                            {
                                formatList.add(height[1] + "p");
                                bitrateList.add(Double.parseDouble(widthxheight[1].replace("Mbps","").trim()));
                            }
                        }
                    }
                    Log.d("TAG", "bitrate" + bitrateList);
                    Log.d("TAG", "isRendererDisabled: " + isRendererDisabled);
                    Log.d("TAG", "selectionOverride: " +  gson.toJson(selectionOverride));
                }
            }
        }

Now Using bitrate Arraylist for example suppose we have: [0.4,0.8,2.6,4.5] we can setMaxVideoBitrate accordingly. you can refer to this link https://gadgetspidy.com/how-to-add-popup-menu-inside-transparent-dialog-in-android-studio/

DefaultTrackSelector.ParametersBuilder builder = new DefaultTrackSelector.ParametersBuilder(this);
        builder.setMaxVideoBitrate((int) Math.round(bitrate));
        //40000000
        //4.5  * 1000000
        //2.6  * 1000000
        //0.8  * 1000000
        //0.4  * 1000000
        trackSelectorParameters = builder.build();
        trackSelector.setParameters(trackSelectorParameters);
Aviraj Patel
  • 270
  • 4
  • 16