Search code examples
androidaudiocasting

Changing audio track in remote media client in cast


Am trying to change the audio track in the cast, As mentioned here https://developers.google.com/cast/docs/android_sender/media_tracks, and did as mentioned there

  • extracted media tracks
  • loaded media to the remote media client
  • and activated active media track

and everything came successful in the log but the audio track is not changing

Am i doing anything wrong, as mention i get getStatusCode() as 0 status code and still audio track is not changing

public void getVideos() {
        
        VideoAdapter adapter = new VideoAdapter (this, videoList);
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener((pos, v) -> {
            stopCastServer();
            String videoPath = webServerController.getMediaInfo(videoList.get(pos).getUrl(), false);

            final ExecutorService service = Executors.newSingleThreadExecutor();
            ExoPlayer player = new ExoPlayer.Builder(this).build();
            MediaItem mediaItem = MediaItem.fromUri(videoPath);
            player.setMediaItem(mediaItem);
            player.prepare();
            ListenableFuture<TrackGroupArray> trackGroupsFuture = MetadataRetriever.retrieveMetadata(this, mediaItem);
            Futures.addCallback(trackGroupsFuture, new FutureCallback<TrackGroupArray>() {
                @Override
                public void onSuccess(TrackGroupArray trackGroups) {
                    for(int i = 0; i < trackGroups.length; i++){
                        String format = trackGroups.get(i).getFormat(0).sampleMimeType;
                        String lang = trackGroups.get(i).getFormat(0).language;
                        String id = trackGroups.get(i).getFormat(0).id;

                        if (format != null && format.contains("application") && id != null && lang != null) {
                            Log.d(TAG, "onSuccess: subtitle " + lang + " " + id + " SERIAL " + i);
                            tracks.add(new MediaTrack.Builder(i, MediaTrack.TYPE_TEXT)
                                    .setName(lang + " Subtitle")
                                    .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
                                    .setContentId(id)
                                    .setLanguage(lang)
                                    .build());
                        } else if (format != null && format.contains("audio") && id != null && lang != null) {
                            Log.d(TAG, "onSuccess: audio " + lang + " " + id + " SERIAL " + i);
                            tracks.add(new MediaTrack.Builder(i, MediaTrack.TYPE_AUDIO)
                                    .setName(lang + " Audio")
                                    .setContentId(id)
                                    .setLanguage(lang)
                                    .build());
                        }
                    }
                    Log.d(TAG, "onSuccess: " + tracks + " url " + videoPath);
                }

                @Override
                public void onFailure(@NonNull Throwable t) {
                    Log.d(TAG, "onFailure: " + t);
                }
            }, service);

            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("first entry")
                    .setMessage("load media to remote media client")
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            loadRemoteMedia(0,false, videoPath);
                        }
                    })

                    .setNegativeButton(android.R.string.no, null)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .show();
        });
    }

    private void loadRemoteMedia(int position, boolean autoPlay, String videoUrl) {
        if (mCastSession == null) {
            return;
        }
        RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
        if (remoteMediaClient == null) {
            return;
        }
       
        remoteMediaClient.load(new MediaLoadRequestData.Builder()
                .setMediaInfo(buildMediaInfo(videoUrl))
                .setAutoplay(autoPlay)
                .setCurrentTime(position).build());

        new AlertDialog.Builder(MainActivity.this)
                .setTitle("second entry")
                .setMessage("selecting audio track")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        remoteMediaClient.setActiveMediaTracks(new long[]{});
                        remoteMediaClient.setActiveMediaTracks(new long[]{3})
                                .setResultCallback(mediaChannelResult -> {
                                    if (mediaChannelResult.getStatus().isSuccess()) {
                                        Log.d(TAG, "onClick: onSuccess "
                                                + mediaChannelResult.getStatus().getStatusCode());
                                    } else {
                                        Log.e(TAG, "Failed with status code: onSuccess "
                                                + mediaChannelResult.getStatus().getStatusCode());
                                    }
                                });
                    }
                })

                .setNegativeButton(android.R.string.no, null)
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }

    private MediaInfo buildMediaInfo(String videoUrl) {
        MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);

        Log.d(TAG, "onSuccess: " + tracks);
        return new MediaInfo.Builder(videoUrl)
                .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
                .setContentType("videos/mp4")
                .setMetadata(movieMetadata)
                .setMediaTracks(tracks) // List<MediaTrack> tracks = new ArrayList<>();
                .setStreamDuration(100000 * 1000)
                .build();
    }

Is there anyway i could change audio language in casting in android ?


Solution

  • Since exoplayer doesn`t allow changing tracks while casting video, So changing tracks doesnt allowed. and after raising a issue in exoplayer https://github.com/google/ExoPlayer/issues/9687

    and recieved CastPlayer currently does not support changing tracks I'm afraid. We have the issue marked as an enhancement

    and https://github.com/google/ExoPlayer#deprecation` its deprecated will no longer have update on it.