在我的应用程序中自定义 exoplayer 质量对话框
Customizing exoplayer quality dialog in my app
我的 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" 选项并仅使所有元素成为单一选择。我该怎么做?
这可能会晚一些,但这里有一些方法,
这里做所有这些很棒的事情的主要 Class 是 "TrackSelectionView",这个 class 只是扩展了一个 LinearLayout。要实现您想要的功能,您需要制作自己的 class(名称任意),然后将 TrackSelectionView 的整个代码复制粘贴到其中。我们为什么要这样做?因为,我们需要更改 class 的一些逻辑,它是只读的 class.
实际上,要实现第一个功能(没有 "none" 选项),您只需编写 dialogPair.second.setShowDisableOption(false);
而不是 "true"。
编写我们自己的 class 和复制粘贴代码是为了第二个功能。
在"TrackSelectionView"中它使用二维数组来存储CheckedTextView。对于前两个切换按钮(Auto 和 None),它单独使用 CheckedTextView,但对于所有其他分辨率,CheckedTextView 存储在该二维数组中。
我不会 post 整个代码库,因为它会使事情变得混乱,我已经创建了一个 github.gist 文件,你可以从那里获得参考...
https://gist.github.com/abhiint16/b473e9b1111bd8bda4833c288ae6a1b4
不要忘记使用 class 引用而不是 TrackSelectionView。
您将使用上述文件,如本要点所示
https://gist.github.com/abhiint16/165449a1a7d1a55a8f69d23718c603c2
Gist 文件进行了选择 "Single-select",除此之外,它还为您执行了很棒的功能,以备您在 ExoPlayer 中需要时使用,
在这里,您获得的实际视频格式是列表中的 512 X 288、0.57 Mbps 格式,我只是映射预定义的低、中、高等列表的索引。你可以试试自己的方法。
因此,当您单击其中一个分辨率时,它会根据所选分辨率("L" 为 "Low")转换 exoplayer 的文本视图。
为此,您只需在 Class 中实现一个名为 GetReso 的接口,然后您将获得选定的文本首字母。现在您可以将该字符串设置为文本视图。
享受编码......
对于 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”。您可以随意修改它。
请注意,它将保留音频和文本轨道的默认格式。
我的 android 应用程序中有视频播放器,我使用 exoplayer
库制作它们。我的播放器可以播放 .m3u8
个视频(我从后端获取它们)并且所有这些都可以是不同的质量,例如 1024x576、768x432 等。我想向用户显示可以更改视频流的对话框质量。为此,我使用 github:
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" 选项并仅使所有元素成为单一选择。我该怎么做?
这可能会晚一些,但这里有一些方法,
这里做所有这些很棒的事情的主要 Class 是 "TrackSelectionView",这个 class 只是扩展了一个 LinearLayout。要实现您想要的功能,您需要制作自己的 class(名称任意),然后将 TrackSelectionView 的整个代码复制粘贴到其中。我们为什么要这样做?因为,我们需要更改 class 的一些逻辑,它是只读的 class.
实际上,要实现第一个功能(没有 "none" 选项),您只需编写 dialogPair.second.setShowDisableOption(false);
而不是 "true"。
编写我们自己的 class 和复制粘贴代码是为了第二个功能。
在"TrackSelectionView"中它使用二维数组来存储CheckedTextView。对于前两个切换按钮(Auto 和 None),它单独使用 CheckedTextView,但对于所有其他分辨率,CheckedTextView 存储在该二维数组中。
我不会 post 整个代码库,因为它会使事情变得混乱,我已经创建了一个 github.gist 文件,你可以从那里获得参考...
https://gist.github.com/abhiint16/b473e9b1111bd8bda4833c288ae6a1b4
不要忘记使用 class 引用而不是 TrackSelectionView。
您将使用上述文件,如本要点所示 https://gist.github.com/abhiint16/165449a1a7d1a55a8f69d23718c603c2
Gist 文件进行了选择 "Single-select",除此之外,它还为您执行了很棒的功能,以备您在 ExoPlayer 中需要时使用,
在这里,您获得的实际视频格式是列表中的 512 X 288、0.57 Mbps 格式,我只是映射预定义的低、中、高等列表的索引。你可以试试自己的方法。
因此,当您单击其中一个分辨率时,它会根据所选分辨率("L" 为 "Low")转换 exoplayer 的文本视图。
为此,您只需在 Class 中实现一个名为 GetReso 的接口,然后您将获得选定的文本首字母。现在您可以将该字符串设置为文本视图。
享受编码......
对于 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”。您可以随意修改它。
请注意,它将保留音频和文本轨道的默认格式。