在我的应用中自定义exoplayer质量对话框

时间:2018-08-31 09:59:20

标签: android exoplayer

我的Android应用中有视频播放器,我使用exoplayer库制作了它们。我的播放器可以播放.m3u8个视频(我是从后端获取的),并且所有视频的质量都可能不同,例如1024x576、768x432等。我想为用户对话框显示可以更改视频流的可能性质量。为此,我使用github中exoplayer示例的下一个代码:

MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
        if (mappedTrackInfo != null) {
            CharSequence title = "Tit;eee";
            int rendererIndex = 0; // renderer for video
            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(this, title, trackSelector, rendererIndex);
            dialogPair.second.setShowDisableOption(true);
            dialogPair.second.setAllowAdaptiveSelections(allowAdaptiveSelections);
            dialogPair.first.show();
}

,它可以正常工作。但是,我需要自定义此对话框,例如删除“ none”选项并使所有元素成为唯一选择。我该怎么做?

2 个答案:

答案 0 :(得分:2)

这可能已经晚了,但这是实现此目的的方法,

执行所有这些出色功能的主要类是“ TrackSelectionView”,该类仅扩展了LinearLayout。要实现所需的功能,您需要创建自己的类(名称为任意名称),然后将TrackSelectionView的整个代码复制粘贴到其中。我们为什么要这样做?因为我们需要更改该类的某些逻辑,这是一个只读类。

实际上,要实现第一个功能(没有“ none”选项),您只需编写dialogPair.second.setShowDisableOption(false);而不是“ true”即可。

为第二个功能编写自己的类和复制粘贴代码。

在“ TrackSelectionView”中,它使用2-D数组存储CheckedTextView。对于前两个切换按钮(“自动”和“无”),它分别使用CheckedTextView,但对于所有其他分辨率,CheckedTextView都存储在该二维数组中。

我不会在此处发布整个代码库,因为这会使事情变得混乱,我创建了一个github.gist文件,您可以从那里获取引用...

https://gist.github.com/abhiint16/b473e9b1111bd8bda4833c288ae6a1b4

不要忘记使用类引用而不是TrackSelectionView。

Gist文件使选择成为“单选”,此外,如果您在ExoPlayer中需要它,它还会为您执行一些很棒的工作,

enter image description here

因此,当您单击某个分辨率时,它将转换exoplayer的文本视图为所选分辨率(“ L”表示“低”)。

为此,您仅需要在您的Class中实现一个名为GetReso的接口,然后您将获得所选的文本缩写。现在,您只需将该字符串设置为textview。

enter image description here

享受编码.....

答案 1 :(得分:1)

对于 2021 年之后看到这个的任何人来说,我花了很长时间才在 Exoplayer 的演示应用程序中实现类似的场景。所以,我决定分享我是如何解决它的。

在 TrackSelectionDialog 文件中使用以下代码。

TrackNameProvider trackNameProvider = new DefaultTrackNameProvider(getResources());
TrackSelectionView trackSelectionView = rootView.findViewById(R.id.exo_track_selection_view);
trackSelectionView.setTrackNameProvider(f -> f.height != Format.NO_VALUE  ? (Math.round(f.frameRate) + " FPS, " + (f.bitrate == Format.NO_VALUE ? "" : (getResources().getString(R.string.exo_track_bitrate, f.bitrate / 1000000f)) ) + ", " + f.height + " P"): trackNameProvider.getTrackName(f));

这会将视频轨道显示为“25 FPS、2.11 Mbps、720P”。您可以随意修改它。

重要的是要注意,它将保留音频和文本轨道的默认格式。