更改Exoplayer HLS质量

时间:2017-12-28 13:26:53

标签: android exoplayer

我正在尝试在Exoplayer中设置视频比特率。我已经设置了这样:

trackSelector = new DefaultTrackSelector(factory);
DefaultTrackSelector.Parameters parameters = trackSelector.getParameters();
parameters.withMaxVideoBitrate(maxBitrate);
parameters.withExceedRendererCapabilitiesIfNecessary(false);
parameters.withExceedVideoConstraintsIfNecessary(false);
trackSelector.setParameters(parameters);

但它不起作用。无处不在我找到了一些关于这个的东西我发现人们正在使用Explayer 2.6中私有的HlsChunk源代码。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

对于那些需要根据自己的需求设置HLS质量的人来说,这是可以做到的,考虑到关于该主题的文章很多,但没有一个人很清楚。

在我2019年撰写的文章中,我假设每个人都在使用ExoPlayer2。

这是给我们最好结果的解决方案。

DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(Objects.requireNonNull(getContext()),
                Util.getUserAgent(this.getContext(), getResources().getString(R.string.app_name)));
trackSelector = new CustomTrackSelector();
            videoSource = new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(mp4VideoUri);
    player = ExoPlayerFactory.newSimpleInstance(this.getContext(), trackSelector);

所以您应该覆盖自定义轨道选择器的行为,覆盖selectTrack方法

public class CustomTrackSelector extends DefaultTrackSelector
{
    public CustomTrackSelector()
    {
        super();
    }
    protected @Nullable
    TrackSelection selectVideoTrack(
            TrackGroupArray groups,
            int[][] formatSupports,
            int mixedMimeTypeAdaptationSupports,
            Parameters params,
            @Nullable TrackSelection.Factory adaptiveTrackSelectionFactory)
            throws ExoPlaybackException
    {
        AdaptiveTrackSelection adaptiveTrackSelection = null;
        if (groups.length > 0)
        {
            for (int groupIndex = 0; groupIndex < groups.length; groupIndex++)
            {
                TrackGroup trackGroup = groups.get(groupIndex);
                int[] tracks = new int[trackGroup.length];
                //creation of indexes array
                for (int i = 0; i < trackGroup.length; i++)
                {
                    tracks[i] = i;
                }

                adaptiveTrackSelection = new AdaptiveTrackSelection(
                        trackGroup,
                        tracks,
                        new DefaultBandwidthMeter(),
                        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);

                for (int i = 0; i < tracks.length; i++)
                {
                    Format format = trackGroup.getFormat(tracks[i]);
                    if (format.width < MIN_WIDTH)
                    {
                        Logger.log(this, "Video track blacklisted with width = " + format.width);
                        adaptiveTrackSelection.blacklist(tracks[i], BLACKLIST_DURATION);
                    } else
                    {
                        Logger.log(this, "Video track NOT blacklisted with width = " + format.width);
                    }
                }
            }
        }

        return adaptiveTrackSelection;
    }
}

上述方法只是将您不想选择的曲目列入黑名单,从而允许播放器在未列入黑名单的曲目之间进行选择。

我们已根据width参数将曲目列入黑名单,但是显然您可以使用bitRate对其进行过滤。

通过这种行为,播放器将从您允许其使用的曲目开始,并且在一段时间(BLACKLIST TIME)后,如果需要,它可以切换回使用所有曲目。 如果您想一直排除曲目,请使用Integer.MAX_VALUE作为黑名单时间。

我希望这对谁在搜索此功能有所帮助。