Как на лету переключить набор адаптации (trackGroup), связанный с видеорендерером, без перезапуска плеераJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как на лету переключить набор адаптации (trackGroup), связанный с видеорендерером, без перезапуска плеера

Сообщение Anonymous »

Я создаю реализацию exoplayer, в которой у меня есть 4 средства рендеринга видео (создано 3 дополнительных). Я изменил манифест DASH таким образом, чтобы каждый набор адаптации представлял ракурс камеры и один набор адаптации для звука. Итак, теперь я назначаю каждый набор адаптации видео (trackGroup) средству видеорендеринга. Таким образом, если имеется 6 наборов адаптации видео, 4 модуля рендеринга изначально инициализируются с 4 наборами адаптации. Теперь я хочу переключить набор адаптации, связанный с средством рендеринга, на набор адаптации, который не используется, указав идентификатор trackGroup и индекс средства рендеринга. Как мне это сделать?
Ниже приведена реализация моего CustomTrackSelector

Код: Выделить всё

public class CustomTrackSelector extends DefaultTrackSelector {

public CustomTrackSelector(Context context) {
super(context);
}

@NonNull
@Override
protected ExoTrackSelection.@NullableType Definition[] selectAllTracks(
@NonNull MappedTrackInfo mappedTrackInfo,
@NonNull @RendererCapabilities.Capabilities int[][][] rendererFormatSupports,
@NonNull @RendererCapabilities.AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports,
@NonNull Parameters params
) throws ExoPlaybackException {
int rendererCount = mappedTrackInfo.getRendererCount();
ExoTrackSelection.@NullableType Definition[] definitions =
new ExoTrackSelection.Definition[rendererCount];
// Custom change start
// Get multiple selected videos if renderers available
@Nullable
ArrayList
> selectedVideos =
selectVideoTracks(
mappedTrackInfo,
rendererFormatSupports,
params,
(int rendererIndex, TrackGroup group, @RendererCapabilities.Capabilities int[] support) ->
VideoTrackInfo.createForTrackGroup(
rendererIndex, group, params, support, rendererMixedMimeTypeAdaptationSupports[rendererIndex]),
VideoTrackInfo::compareSelections
);
if (selectedVideos != null) {
for (Pair selectedVideo: selectedVideos) {
@Nullable
Pair selectedImage =
params.isPrioritizeImageOverVideoEnabled || selectedVideo == null
? selectImageTrack(mappedTrackInfo, rendererFormatSupports, params)
: null;

if (selectedImage != null) {
definitions[selectedImage.second] = selectedImage.first;
} else if (selectedVideo != null) {
definitions[selectedVideo.second] = selectedVideo.first;
}
}
}
// Custom change end
@Nullable
Pair selectedAudio =
selectAudioTrack(
mappedTrackInfo,
rendererFormatSupports,
rendererMixedMimeTypeAdaptationSupports,
params);
if (selectedAudio != null) {
definitions[selectedAudio.second] = selectedAudio.first;
}

@Nullable
String selectedAudioLanguage =
selectedAudio == null
? null
: selectedAudio.first.group.getFormat(selectedAudio.first.tracks[0]).language;
@Nullable
Pair selectedText =
selectTextTrack(mappedTrackInfo, rendererFormatSupports, params, selectedAudioLanguage);
if (selectedText != null) {
definitions[selectedText.second] = selectedText.first;
}

for (int i = 0; i < rendererCount; i++) {
int trackType = mappedTrackInfo.getRendererType(i);
if (trackType != C.TRACK_TYPE_VIDEO
&& trackType != C.TRACK_TYPE_AUDIO
&& trackType != C.TRACK_TYPE_TEXT
&& trackType != C.TRACK_TYPE_IMAGE) {
definitions[i] =
selectOtherTrack(
trackType, mappedTrackInfo.getTrackGroups(i), rendererFormatSupports[i], params);
}
}
return definitions;
}

private  ArrayList selectVideoTracks(
MappedTrackInfo mappedTrackInfo,
int[][][] rendererFormatSupports,
Parameters params,
TrackInfo.Factory trackInfoFactory,
Comparator  selectionComparator
) {
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
return null;
}
@C.TrackType int trackType = C.TRACK_TYPE_VIDEO;
ArrayList possibleSelections;
ArrayList possibleSelectionsPerRenderer = new ArrayList();
int rendererCount = mappedTrackInfo.getRendererCount();
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
possibleSelections = new ArrayList();
if (trackType == mappedTrackInfo.getRendererType(rendererIndex)) {
TrackGroupArray groups = mappedTrackInfo.getTrackGroups(rendererIndex);
for (int groupIndex = 0; groupIndex < groups.length; groupIndex++) {
TrackGroup trackGroup = groups.get(groupIndex);
@RendererCapabilities.Capabilities int[] groupSupport = rendererFormatSupports[rendererIndex][groupIndex];
List trackInfos = trackInfoFactory.create(rendererIndex, trackGroup, groupSupport);
boolean[] usedTrackInSelection = new boolean[trackGroup.length];
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
T trackInfo = trackInfos.get(trackIndex);
@SelectionEligibility int eligibility = trackInfo.getSelectionEligibility();
if (usedTrackInSelection[trackIndex] || eligibility == SELECTION_ELIGIBILITY_NO) {
continue;
}
List selection;
if (eligibility == SELECTION_ELIGIBILITY_FIXED) {
selection = ImmutableList.of(trackInfo);
} else {
selection = new ArrayList();
selection.add(trackInfo);
for (int i = trackIndex + 1; i < trackGroup.length; i++) {
T otherTrackInfo = trackInfos.get(i);
if (otherTrackInfo.getSelectionEligibility() == SELECTION_ELIGIBILITY_ADAPTIVE) {
if (trackInfo.isCompatibleForAdaptationWith(otherTrackInfo)) {
selection.add(otherTrackInfo);
usedTrackInSelection[i] = true;
}
}
}
}
possibleSelections.add(selection);
}
}
}
possibleSelectionsPerRenderer.add(possibleSelections);
}
if (possibleSelectionsPerRenderer.isEmpty()) {
return null;
}
ArrayList selectedVideos = new ArrayList();
for (ArrayList selections: possibleSelectionsPerRenderer) {
if (selections.isEmpty()) continue;
List bestSelection = max(selections, selectionComparator);
int[] trackIndices = new int[bestSelection.size()];
for (int i = 0; i < bestSelection.size(); i++) {
trackIndices[i] = bestSelection.get(i).trackIndex;
}
T firstTrackInfo = bestSelection.get(0);
selectedVideos.add(Pair.create(
new ExoTrackSelection.Definition(firstTrackInfo.trackGroup, trackIndices),
firstTrackInfo.rendererIndex)
);
}
return selectedVideos;
}
}
Ниже приведен мой код playerManager.

Код: Выделить всё

public class PlayerManager {
private final Context context;
private ExoPlayer player;
private final SurfaceViewManager surfaceViewManager;
private final ArrayList cameraNames = new ArrayList();
private static final String TAG = "HELLO";

public PlayerManager(Context context, SurfaceViewManager surfaceViewManager) {
this.context = context;
this.surfaceViewManager = surfaceViewManager;
}

CustomTrackSelector trackSelector;

@OptIn(markerClass = UnstableApi.class)
public ExoPlayer initializePlayer(int numOfViews, Map replayData){
for (Map.Entry  entry : replayData.entrySet()) {
cameraNames.add(entry.getKey());
}
DashMediaSource dashMediaSource = new DashMediaSource.Factory(new DefaultDataSource.Factory(context))
.createMediaSource(MediaItem.fromUri(Uri.parse("http://192.168.1.9:8009/replay_emo_goal3_manifest.mpd")));

trackSelector = new CustomTrackSelector(context);
player = new ExoPlayer.Builder(context)
.setRenderersFactory(new CustomRenderersFactory(context, numOfViews))
.setTrackSelector(trackSelector)
.build();
player.setMediaSource(dashMediaSource);
player.setRepeatMode(Player.REPEAT_MODE_ALL);
player.setPlayWhenReady(true);
player.prepare();
return player;
}

@OptIn(markerClass = UnstableApi.class)
public ArrayList setupRenderers(ExoPlayer player) {
ArrayList videoRenderers = new ArrayList();
for (int i = 0; i < player.getRendererCount(); i++) {
if (player.getRendererType(i) == C.TRACK_TYPE_VIDEO) {
videoRenderers.add(player.getRenderer(i));
}
}
surfaceViewManager.attachRenderersToSurfaces(player, videoRenderers);
surfaceViewManager.attachLabelsToTextViews(cameraNames);
return  videoRenderers;
}

@OptIn(markerClass = UnstableApi.class)
public void switchRendererTrack(){
logActiveAdaptationSets();
switchRendererTrack(0,3);
logActiveAdaptationSets();
}

@OptIn(markerClass = UnstableApi.class)
public void switchRendererTrack(int rendererIndex, int adaptationSetIndex) {
TrackGroupArray trackGroups = player.getCurrentTrackGroups();
// Find the TrackGroup for the given adaptation set index
TrackGroup selectedTrackGroup = trackGroups.get(adaptationSetIndex);
// Create a new TrackSelectionOverride specific to the renderer’s assigned TrackGroup
TrackSelectionOverride trackSelectionOverride = new TrackSelectionOverride(selectedTrackGroup, ImmutableList.of(0));
// Update parameters by building upon the current parameters and applying the override for video
TrackSelectionParameters newParameters = trackSelector.buildUponParameters()
.clearOverridesOfType(C.TRACK_TYPE_VIDEO)
.addOverride(trackSelectionOverride)
.build();
// Apply new parameters to the track selector
trackSelector.setParameters(newParameters);
Log.d(TAG, "Switched adaptation set for renderer " + rendererIndex + " to adaptation set " + adaptationSetIndex);
}
Когда я пытаюсь использовать переопределение выбора трека, другие мои средства визуализации перестают воспроизводиться, и переключение не происходит.
Буду очень признателен за любую помощь. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... renderer-o
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»