The two codes are similar, but there are several notable differences, particularly in how they handle audio and video streams. Here are the main differences:
1. Video Stream Management
-
First code:
- Uses
getNonTorrentStreams(info.getVideoStreams())
andgetNonTorrentStreams(info.getVideoOnlyStreams())
. - This means it filters the streams by removing the ones that are torrents.
- Uses
-
Second code:
- Uses
getPlayableStreams(info.getVideoStreams(), info.getServiceId())
andgetPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId())
. - This means it filters the streams based on "playability" criteria and includes a
info.getServiceId()
parameter.
- Uses
➡️ The second code seems more precise in selecting streams, taking into account the service being used.
2. Audio Stream Management
-
First code:
- Fetches audio streams with
getNonTorrentStreams(info.getAudioStreams())
. - By default, selects a stream with
ListHelper.getDefaultAudioFormat(context, audioStreams)
.
- Fetches audio streams with
-
Second code:
- Filters audio streams with
getFilteredAudioStreams(context, info.getAudioStreams())
. - Chooses a stream with
ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack)
, which seems to consider a specific audio track (audioTrack
).
- Filters audio streams with
➡️ The second code offers more flexibility by allowing the selection of a specific audio track (audioTrack
).
3. Metadata Management and MediaItemTag
- First code:
- Creates a
MediaItemTag
with only the video:final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, index);
- Creates a
- Second code:
- Creates a
MediaItemTag
with both the video and audio:final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex);
- Creates a
➡️ The second code directly associates both an audio and a video stream with the MediaItemTag
, which is more precise.
4. Audio/Video Check and Merging
- First code:
- Checks if the video has no sound (
video.isVideoOnly()
). - If so, it adds a separate audio stream.
- Checks if the video has no sound (
- Second code:
- Performs the same check but includes an additional condition:
if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null))
- This means it also considers a specific audio track (
audioTrack
).
- Performs the same check but includes an additional condition:
➡️ The second code offers better audio stream management, including the ability to force a specific audio track.
5. New audioTrack
Property in the Second Code
- The second code adds an additional property:
private String audioTrack;
- It also provides associated methods:
public String getAudioTrack() { return audioTrack; } public void setAudioTrack(@Nullable final String audioLanguage) { this.audioTrack = audioLanguage; }
➡️ This allows you to choose a specific audio language, a feature missing from the first code.
Conclusion:
- The second code is more advanced and flexible.
- It better takes into account the specifics of the service (via
info.getServiceId()
). - It allows selecting a specific audio track (
audioTrack
). - It directly associates video and audio with the
MediaItemTag
.
If you're looking for better stream and audio track management, the second code is more performant and adaptable.
Les deux codes sont similaires, mais il existe plusieurs différences notables, notamment dans la manière dont ils gèrent les flux audio et vidéo. Voici les principales différences :
1. Gestion des flux vidéo
-
Premier code :
- Utilise
getNonTorrentStreams(info.getVideoStreams())
etgetNonTorrentStreams(info.getVideoOnlyStreams())
. - Cela signifie qu’il filtre les flux en supprimant ceux qui sont des torrents.
- Utilise
-
Deuxième code :
- Utilise
getPlayableStreams(info.getVideoStreams(), info.getServiceId())
etgetPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId())
. - Cela signifie qu’il filtre les flux selon des critères de "jouabilité" et inclut un paramètre
info.getServiceId()
.
- Utilise
➡️ Le deuxième code semble plus précis dans le choix des flux, en tenant compte du service utilisé.
2. Gestion des flux audio
-
Premier code :
- Récupère les flux audio avec
getNonTorrentStreams(info.getAudioStreams())
. - Sélectionne par défaut un flux avec
ListHelper.getDefaultAudioFormat(context, audioStreams)
.
- Récupère les flux audio avec
-
Deuxième code :
- Filtre les flux audio avec
getFilteredAudioStreams(context, info.getAudioStreams())
. - Sélectionne un flux avec
ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack)
, qui semble prendre en compte une piste audio spécifique (audioTrack
).
- Filtre les flux audio avec
➡️ Le deuxième code offre plus de flexibilité en permettant la sélection d'une piste audio précise (audioTrack
).
3. Gestion des métadonnées et du MediaItemTag
- Premier code :
- Crée un
MediaItemTag
avec uniquement la vidéo :final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, index);
- Crée un
- Deuxième code :
- Crée un
MediaItemTag
avec la vidéo et l'audio :final MediaItemTag tag = StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex);
- Crée un
➡️ Le deuxième code associe directement un flux audio et un flux vidéo au MediaItemTag
, ce qui est plus précis.
4. Vérification et fusion audio/vidéo
- Premier code :
- Vérifie si la vidéo n’a pas de son (
video.isVideoOnly()
). - Si oui, ajoute un flux audio séparé.
- Vérifie si la vidéo n’a pas de son (
- Deuxième code :
- Fait la même vérification mais inclut une condition supplémentaire :
if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null))
- Cela signifie qu’il prend aussi en compte une piste audio spécifique (
audioTrack
).
- Fait la même vérification mais inclut une condition supplémentaire :
➡️ Le deuxième code offre une meilleure gestion des flux audio, notamment en permettant de forcer une piste audio spécifique.
5. Nouvelle propriété audioTrack
dans le deuxième code
- Le deuxième code ajoute une propriété supplémentaire :
private String audioTrack;
- Il propose aussi des méthodes associées :
public String getAudioTrack() { return audioTrack; } public void setAudioTrack(@Nullable final String audioLanguage) { this.audioTrack = audioLanguage; }
➡️ Cela permet de choisir une langue audio spécifique, une fonctionnalité absente du premier code.
Conclusion :
- Le deuxième code est plus avancé et flexible.
- Il prend mieux en compte les spécificités du service (via
info.getServiceId()
). - Il permet de sélectionner une piste audio précise (
audioTrack
). - Il associe directement vidéo et audio au
MediaItemTag
.
Si vous cherchez une meilleure gestion des flux et des pistes audio, le deuxième code est plus performant et adaptable.