Interface which allows to filter
Tracks
, before
the
PlayerModel
is built.
An instance of the Filter should be added to the PlayerController before
opening
it.
Each method should remove the non-desired tracks from the provided
Collections
.
Example implementation:
playerController.addPlayerModelFilter(new PlayerModelFilter() {
@Override
public void onVideoTracks(@NonNull Collection videoTracks) {
// Build qualities, we want to keep only the highest bitrate track
// for each resolution.
SparseIntArray qualitiesMap = new SparseIntArray();
for (VideoTrack track : videoTracks) {
for (VideoTrackQuality quality : track.getQualities()) {
final int bitrate = quality.getBitrate();
final int width = quality.getWidth();
if (bitrate < 0 || width < 0) {
continue;
}
qualitiesMap.put(width, Math.max(bitrate, qualitiesMap.get(width)));
}
}
// Apply filter
for (MutableVideoTrack track : videoTracks) {
for (VideoTrackQuality quality : track.getQualities()) {
if (qualitiesMap.get(quality.getWidth()) != quality.getBitrate()) {
track.removeQuality(quality);
}
}
}
}
@Override
public void onAudioTracks(@NonNull Collection audioTracks) {
// Remove italian audio tracks
for (Iterator iterator = audioTracks.iterator(); iterator.hasNext(); ) {
AudioTrack audioTrack = iterator.next();
if (audioTrack.getLanguage().toLowerCase().contains("it")) {
iterator.remove();
}
}
}
@Override
public void onSubtitleTracks(@NonNull Collection subtitleTracks) {
// Remove French subtitle tracks
for (Iterator iterator = subtitleTracks.iterator(); iterator.hasNext(); ) {
SubtitleTrack subtitleTrack = iterator.next();
if (subtitleTrack.getLanguage().toLowerCase().contains("fr")) {
iterator.remove();
}
}
}
});
playerController.open(playbackBundle);