Я создаю реализацию exoplayer, в которой у меня есть 4 средства рендеринга видео (создано 3 дополнительных). Я изменил манифест DASH таким образом, чтобы каждый набор адаптации представлял ракурс камеры и один набор адаптации для звука. Итак, теперь я назначаю каждый набор адаптации видео (trackGroup) средству видеорендеринга. Таким образом, если имеется 6 наборов адаптации видео, 4 модуля рендеринга изначально инициализируются с 4 наборами адаптации. Теперь я хочу переключить набор адаптации, связанный с средством рендеринга, на набор адаптации, который не используется, указав идентификатор trackGroup и индекс средства рендеринга. Как мне это сделать?
Ниже приведена реализация моего CustomTrackSelector
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);
}
Когда я пытаюсь использовать переопределение выбора трека, другие мои средства визуализации перестают воспроизводиться, и переключение не происходит.
Буду очень признателен за любую помощь. Заранее спасибо!
Я создаю реализацию exoplayer, в которой у меня есть 4 средства рендеринга видео (создано 3 дополнительных). Я изменил манифест DASH таким образом, чтобы каждый набор адаптации представлял ракурс камеры и один набор адаптации для звука. Итак, теперь я назначаю каждый набор адаптации видео (trackGroup) средству видеорендеринга. Таким образом, если имеется 6 наборов адаптации видео, 4 модуля рендеринга изначально инициализируются с 4 наборами адаптации. Теперь я хочу переключить набор адаптации, связанный с средством рендеринга, на набор адаптации, который не используется, указав идентификатор trackGroup и индекс средства рендеринга. Как мне это сделать? Ниже приведена реализация моего CustomTrackSelector [code]public class CustomTrackSelector extends DefaultTrackSelector {
public CustomTrackSelector(Context context) { super(context); }
@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); } [/code] Когда я пытаюсь использовать переопределение выбора трека, другие мои средства визуализации перестают воспроизводиться, и переключение не происходит. Буду очень признателен за любую помощь. Заранее спасибо!