您想要实现的一切都可以在 ExoPlayer2 中查看demo app https://github.com/google/ExoPlayer。更具体地说PlayerActivity https://github.com/google/ExoPlayer/blob/release-v2/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java class.
你也可以看看这个好文章 https://medium.com/google-exoplayer/exoplayer-2-x-track-selection-2b62ff712cc9关于这个话题。
您需要研究的核心点是围绕曲目选择(通过TrackSelector
)以及TrackSelectionHelper
。我将在下面提供重要的代码示例,希望这些示例足以帮助您继续前进。但最终,只需遵循演示应用程序中类似的操作即可到达您需要的位置。
您将保留启动播放器时使用的曲目选择器,并将其用于几乎所有事情。
下面只是一段代码,理想地涵盖了您想要做的事情的要点,因为该演示似乎确实使事情变得过于复杂。我还没有运行代码,但它已经足够接近了。
// These two could be fields OR passed around
int videoRendererIndex;
TrackGroupArray trackGroups;
// This is the body of the logic for see if there are even video tracks
// It also does some field setting
MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
for (int i = 0; i < mappedTrackInfo.length; i++) {
TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(i);
if (trackGroups.length != 0) {
switch (player.getRendererType(i)) {
case C.TRACK_TYPE_VIDEO:
videoRendererIndex = i;
return true;
}
}
}
// This next part is actually about getting the list. It doesn't include
// some additional logic they put in for adaptive tracks (DASH/HLS/SS),
// but you can look at the sample for that (TrackSelectionHelper#buildView())
// Below you'd be building up items in a list. This just does
// views directly, but you could just have a list of track names (with indexes)
for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
TrackGroup group = trackGroups.get(groupIndex);
for (int trackIndex = 0; trackIndex < group.length; trackIndex++) {
if (trackIndex == 0) {
// Beginning of a new set, the demo app adds a divider
}
CheckedTextView trackView = ...; // The TextView to show in the list
// The below points to a util which extracts the quality from the TrackGroup
trackView.setText(DemoUtil.buildTrackName(group.getFormat(trackIndex)));
}
// Assuming you tagged the view with the groupIndex and trackIndex, you
// can build your override with that info.
Pair<Integer, Integer> tag = (Pair<Integer, Integer>) view.getTag();
int groupIndex = tag.first;
int trackIndex = tag.second;
// This is the override you'd use for something that isn't adaptive.
override = new SelectionOverride(FIXED_FACTORY, groupIndex, trackIndex);
// Otherwise they call their helper for adaptives, which roughly does:
int[] tracks = getTracksAdding(override, trackIndex);
TrackSelection.Factory factory = tracks.length == 1 ? FIXED_FACTORY : adaptiveTrackSelectionFactory;
override = new SelectionOverride(factory, groupIndex, tracks);
// Then we actually set our override on the selector to switch the quality/track
selector.setSelectionOverride(rendererIndex, trackGroups, override);
正如我上面提到的,这个过程有点过于简单化,但核心部分是你在搞乱TrackSelector
, SelectionOverride
, and Track
/TrackGroups
让它发挥作用。
可以想象,您可以逐字复制演示代码,它应该可以工作,但我强烈建议花时间了解每个部分的作用,并根据您的用例定制您的解决方案。
如果我有更多时间,我会编译并运行它。但如果您可以使用我的示例,请随意编辑我的帖子。
希望有帮助:)