Exoplayer 2 - Как отображать субтитры без URI, но со строкой? - PullRequest
0 голосов
/ 09 октября 2018

Я хотел бы отобразить предварительно загруженные субтитры с помощью exoplayer 2 и предоставить игроку строку на основе webvtt для обработки субтитров.

Моя система должна работать следующим образом:

  1. Я отправляю запрос на мой сервер для получения субтитров (в зашифрованном виде)
  2. Я дешифрую ответ сервера, чтобы получить строку субтитров (в формате webvtt)
  3. Я бы хотелпередайте эту строку exoplayer.Exoplayer должен иметь возможность отображать сабвуферы, как если бы я использовал webvtt uri.

Я не хочу использовать системный файл, потому что он сделает файлы субтитров доступными для пользователя.


см. Ниже код моей деятельности:

//Class Player Activity

// ... activity code ...

public void initializePlayer(){
 //... code intialization of player ...
 mVideoEventListener = new VideoEventListener(this);

 if(mEpisode.getVideo().getSubtitle() == null) {
  mEpisode.getVideo().loadSubtitle(this, Video.VO, mVideoEventListener);
        return;
 }
 hasSubtitle = true;
 startPlayer();
}

public void startPlayer(){
 boolean haveStartPosition = startWindow != C.INDEX_UNSET;
 if (haveStartPosition) {
  mPlayer.seekTo(startWindow, startPosition);
 }
 if(hasVideo && hasSubtitle){
  MergingMediaSource mergedSource = new MergingMediaSource(mVideoSource, mSubtitleSource);
  mPlayer.prepare(mergedSource, !haveStartPosition, false);
 }
}

// ... activity code ...

private class VideoEventListener implements
 Video.SubtitleListener,
 LoadBalancer.OnLoadBalanceListener{

 private final Context mCtx;

 VideoEventListener(Context ctx) {
  mCtx = ctx;
 }

 @Override
 public void onSubtitleLoaded(String subtitle) {
  hasSubtitle = true;

  Format subtitleFormat = Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, C.SELECTION_FLAG_FORCED, "fr");

  mSubtitleSource = //My problem : How create a mediaSource with variable "subtitle" in format WebVTT ?

  startPlayer();
 }
}

1 Ответ

0 голосов
/ 11 октября 2018

Я нашел свой ответ под кодом:

    @Override
    public void onSubtitleLoaded(String s) {
        hasSubtitle = true;

        Format subtitleFormat = Format.createTextSampleFormat(
                "test", MimeTypes.TEXT_VTT, C.SELECTION_FLAG_FORCED, "fr");

        mSubtitleSource =
                new SingleSampleMediaSource.Factory(new CustomDataSourceFactory(ctx, null, s.getBytes()))
                        .createMediaSource(Uri.parse(""), subtitleFormat, C.TIME_UNSET);

    }

CustomDataSourceFactory class

public class CustomDataSourceFactory implements DataSource.Factory {
    private final Context context;
    private final @Nullable TransferListener listener;
    private byte[] subtitles;

    public CustomDataSourceFactory(
        Context context,
        @Nullable TransferListener listener,
        byte[] subtitles) {
        this.context = context.getApplicationContext();
        this.subtitles = subtitles;
        this.listener = listener;
    }

    @Override
    public DataSource createDataSource() {
        ByteArrayDataSource dataSource = new ByteArrayDataSource(subtitles);
        if (listener != null) {
            dataSource.addTransferListener(listener);
        }
        return dataSource;
    }
}
...