Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to integrate subtitle with exoplayer android

I am using Exoplayer to play different types of videos, I have download this demo and work with it

https://github.com/google/ExoPlayer

now I need to add subtitle for my video, I am using ExoPlayer version 2.9.5

this is the method that build the media source

private MediaSource buildMediaSource(Uri uri, @Nullable String overrideExtension) {
    @ContentType int type = Util.inferContentType(uri, overrideExtension);
    switch (type) {
      case C.TYPE_DASH:
        return new DashMediaSource.Factory(dataSourceFactory)
            .setManifestParser(
                new FilteringManifestParser<>(new DashManifestParser(), getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_SS:
        return new SsMediaSource.Factory(dataSourceFactory)
            .setManifestParser(
                new FilteringManifestParser<>(new SsManifestParser(), getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_HLS:
        return new HlsMediaSource.Factory(dataSourceFactory)
            .setPlaylistParserFactory(
                new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
            .createMediaSource(uri);
      case C.TYPE_OTHER:
        return new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
      default: {
        throw new IllegalStateException("Unsupported type: " + type);
      }
    }
  }

I guess this is the place that should be changed to add subtitle to my media file, But I do not know how ?

also the subtitle will be from server and with .str format

can anyone help please ?

here is my updated code

private MediaSource buildMediaSourceWithSubtitle (Uri uri, @Nullable String overrideExtension, Uri subtitle) {

    Format subtitleFormat = Format.createTextSampleFormat(
            null, // An identifier for the track. May be null.
            MimeTypes.APPLICATION_SUBRIP, // The mime type. Must be set correctly.
            0, // Selection flags for the track.
            null); // The subtitle language. May be null.
    MediaSource subtitleSource =
            new SingleSampleMediaSource.Factory(dataSourceFactory)
        .createMediaSource(subtitle, subtitleFormat, C.TIME_UNSET);

    MediaSource mediaSource = null;

    @ContentType int type = Util.inferContentType(uri, overrideExtension);
    switch (type) {
      case C.TYPE_DASH:
        mediaSource = new DashMediaSource.Factory(dataSourceFactory)
                .setManifestParser(
                        new FilteringManifestParser<>(new DashManifestParser(), getOfflineStreamKeys(uri)))
                .createMediaSource(uri);

        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_SS:
        mediaSource = new SsMediaSource.Factory(dataSourceFactory)
                .setManifestParser(
                        new FilteringManifestParser<>(new SsManifestParser(), getOfflineStreamKeys(uri)))
                .createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_HLS:
        mediaSource = new HlsMediaSource.Factory(dataSourceFactory)
                .setPlaylistParserFactory(
                        new DefaultHlsPlaylistParserFactory(getOfflineStreamKeys(uri)))
                .createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);

      case C.TYPE_OTHER:
        mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
        return new MergingMediaSource(mediaSource, subtitleSource);
      default: {
        throw new IllegalStateException("Unsupported type: " + type);
      }
    }
  }

enter image description here

like image 250
Amira Elsayed Ismail Avatar asked Dec 02 '25 05:12

Amira Elsayed Ismail


1 Answers

     public MediaSource getTextSource(Uri subTitle) {     //subTitle = Uri.parse(file.getAbsolutePath().toString());  file -- the local .srt file
    //todo C.SELECTION_FLAG_AUTOSELECT language MimeTypes
    Format textFormat = new Format.Builder()
            .setSampleMimeType(MimeTypes.APPLICATION_SUBRIP)
            .setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
            .build();

    MediaItem.SubtitleConfiguration  subtitle = new MediaItem.SubtitleConfiguration.Builder(subTitle)
            .setMimeType(checkNotNull(textFormat.sampleMimeType))
            .setLanguage( textFormat.language)
            .setSelectionFlags(textFormat.selectionFlags).build();

    DefaultHttpDataSource.Factory  factory = new DefaultHttpDataSource.Factory()
            .setAllowCrossProtocolRedirects(true)
            .setConnectTimeoutMs(50000)
            .setReadTimeoutMs(50000)
            .setTransferListener( new DefaultBandwidthMeter.Builder(this).build());

    MediaSource textMediaSource = new SingleSampleMediaSource.Factory(new DefaultDataSource.Factory(this,
            factory))
            .createMediaSource(subtitle, C.TIME_UNSET);
    return textMediaSource;
}

then in initplayer()

concatenatingMediaSource = new ConcatenatingMediaSource();
 MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(videoUri));
MediaSource subtitleSource = getTextSource(subtitleUri);
MergingMediaSource mergingMediaSource = new MergingMediaSource(mediaSource, subtitleSource);
concatenatingMediaSource.addMediaSource(mergingMediaSource);
player.setMediaSource(concatenatingMediaSource);
like image 99
b y f hc Avatar answered Dec 06 '25 14:12

b y f hc



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!