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()) and getNonTorrentStreams(info.getVideoOnlyStreams()).
    • This means it filters the streams by removing the ones that are torrents.
  • Second code:

    • Uses getPlayableStreams(info.getVideoStreams(), info.getServiceId()) and getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()).
    • This means it filters the streams based on "playability" criteria and includes a info.getServiceId() parameter.

➡️ 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).
  • 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).

➡️ 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);
      
  • Second code:
    • Creates a MediaItemTag with both the video and audio:
      final MediaItemTag tag =
          StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex);
      

➡️ 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.
  • 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).

➡️ 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()) et getNonTorrentStreams(info.getVideoOnlyStreams()).
    • Cela signifie qu’il filtre les flux en supprimant ceux qui sont des torrents.
  • Deuxième code :

    • Utilise getPlayableStreams(info.getVideoStreams(), info.getServiceId()) et getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()).
    • Cela signifie qu’il filtre les flux selon des critères de "jouabilité" et inclut un paramètre info.getServiceId().

➡️ 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).
  • 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).

➡️ 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);
      
  • Deuxième code :
    • Crée un MediaItemTag avec la vidéo et l'audio :
      final MediaItemTag tag =
          StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex);
      

➡️ 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é.
  • 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).

➡️ 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.