Как инициализировать exoplayer для воспроизведения видео dash(.mpd)

У меня есть список воспроизведения тире-видео, и это был код, который я использовал для воспроизведения мультимедиа, когда была версия 2.7.3. Теперь я обновился до 2.9.5, у меня проблемы.

Мои методы инициализации и источника мультимедиа:

private void initializePlayer() {
       if (player == null) {
  // a factory to create an AdaptiveVideoTrackSelection
  TrackSelection.Factory adaptiveTrackSelectionFactory =
          new AdaptiveTrackSelection.Factory(BANDWIDTH_METER);

  player = ExoPlayerFactory.newSimpleInstance(
          new DefaultRenderersFactory(this),
          new DefaultTrackSelector(adaptiveTrackSelectionFactory),
          new DefaultLoadControl());
  player = ExoPlayerFactory.newSimpleInstance(new DefaultRenderersFactory(this),
          new DefaultTrackSelector(), new DefaultLoadControl());
  playerView.setPlayer(player);
  player.addListener(new PlayerEventListener());
        /*player.setPlayWhenReady(playWhenReady);
        player.seekTo(currentWindow, playbackPosition);*/
}

playListMediaSources = buildPlayListMediaSource(serialURLs);

concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);

player.prepare(concatenatingMediaSource, true, false);
player.setPlayWhenReady(playWhenReady);
player.seekTo(currentWindow, playbackPosition);
    }



private MediaSource buildMediaSource(Uri uri) {

  /*  DefaultExtractorsFactory defaultExtractorsFactory = new DefaultExtractorsFactory();
    DefaultHttpDataSourceFactory defaultHttpDataSourceFactory = new DefaultHttpDataSourceFactory("user-agent");*/

        DataSource.Factory manifestDataSourceFactory =
                new DefaultHttpDataSourceFactory("ua");
        DashChunkSource.Factory dashChunkSourceFactory =
                new DefaultDashChunkSource.Factory(
                        new DefaultHttpDataSourceFactory("ua", BANDWIDTH_METER));
        return new DashMediaSource.Factory(dashChunkSourceFactory,
                manifestDataSourceFactory).createMediaSource(uri);
    }


    private MediaSource[] buildPlayListMediaSource(String[] serialURLs) {


        MediaSource[] mediaSources = new MediaSource[serialURLs.length];
        Uri uri;
        for (int i = 0; i < serialURLs.length; i++) {
            uri = Uri.parse(serialURLs[i]);
            mediaSources[i] = buildMediaSource(uri);
        }
        return mediaSources;
    }

Я изменил свой код инициализации следующим образом:

 private void initializePlayer() {
        if (player == null) {

            TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory();

           player = ExoPlayerFactory.newSimpleInstance(this,
                    new DefaultRenderersFactory(this),
                    new DefaultTrackSelector(adaptiveTrackSelectionFactory),
                    new DefaultLoadControl());
            player = ExoPlayerFactory.newSimpleInstance(this,new DefaultRenderersFactory(this),
                    new DefaultTrackSelector(), new DefaultLoadControl());


        }


            if (serialURLs != null) {

                playListMediaSources = buildPlayListMediaSource(serialURLs);
                concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);
                player.prepare(concatenatingMediaSource, true, false);
                player.setPlayWhenReady(playWhenReady);
                player.seekTo(currentWindow, playbackPosition);
    }
    }

Но не удалось воспроизвести видео. Я предполагаю, что мне также нужно внести некоторые изменения в методы источников мультимедиа, но я не могу понять эти изменения. С моим текущим кодом журнал показывает следующую ошибку:

E/AndroidRuntime: FATAL EXCEPTION: ExoPlayerImplInternal:Handler
    Process: com.packagename, PID: 2731
    java.lang.AbstractMethodError: abstract method "void com.google.android.exoplayer2.source.BaseMediaSource.prepareSourceInternal(com.google.android.exoplayer2.upstream.TransferListener)"
        at com.google.android.exoplayer2.source.BaseMediaSource.prepareSource(BaseMediaSource.java:140)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.prepareInternal(ExoPlayerImplInternal.java:398)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:285)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:164)
        at android.os.HandlerThread.run(HandlerThread.java:65)

Я добавляю этот текст, чтобы избежать ошибок кода. Любая помощь приветствуется. Заранее спасибо.


person Sumukha Aithal K    schedule 22.03.2019    source источник
comment
привет, у тебя есть решение?   -  person Richa Shah    schedule 21.01.2020


Ответы (2)


И com.google.android.exoplayer:exoplayer-core, и com.google.android.exoplayer:exoplayer-dash должны быть одной и той же версии в вашем build.gradle.

implementation 'com.google.android.exoplayer:exoplayer-core:2.9.6'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.9.6'
person sskodje    schedule 26.06.2019

Наконец я остановился на этом:

private void initializePlayer() {
        if (player == null) {

            TrackSelection.Factory adaptiveTrackSelection = new AdaptiveTrackSelection.Factory();
            TrackSelector trackSelector = new DefaultTrackSelector(adaptiveTrackSelection);

            DefaultLoadControl loadControl = new DefaultLoadControl.Builder().setBufferDurationsMs(64*1024, 128*1024, 1024, 1024).createDefaultLoadControl();
            //LoadControl loadControl = new DefaultLoadControl();
            //  HttpDataSource.Factory factory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "Exo2"));
            player = ExoPlayerFactory.newSimpleInstance(this,new DefaultRenderersFactory(this), trackSelector, loadControl);
            playerView.setPlayer(player);
            player.addListener(new PlayerEventListener());

        }

        if (isPlaylist) {
            if (serialURLs != null) {

                nextBtn.setVisibility(View.VISIBLE);

                playListMediaSources = buildPlayListMediaSource(serialURLs);

                concatenatingMediaSource = new ConcatenatingMediaSource(playListMediaSources);
                readLastSeen(contentName, isWebSeries);
                player.prepare(concatenatingMediaSource, true, false);
                player.setPlayWhenReady(playWhenReady);
                player.seekTo(currentWindow, playbackPosition);
            } else {
                // previousBtn.setVisibility(View.GONE);
                //nextBtn.setVisibility(View.GONE);
                Uri uri = Uri.parse(getString(R.string.sample_video));  
                mediaSource = buildMediaSource(uri);

                Toast.makeText(MediaPlayerActivity.this, "Playing sample video..", Toast.LENGTH_LONG).show();
                player.prepare(mediaSource, true, false);
                player.setPlayWhenReady(playWhenReady);
                player.seekTo(playbackPosition);
            }
        } else {
            if (videoURL != null) {

                Uri uri = Uri.parse(videoURL); 
                mediaSource = buildMediaSource(uri);


            } 
            player.prepare(mediaSource, true, false);
            player.setPlayWhenReady(playWhenReady);
            player.seekTo(playbackPosition);
        }



    }



private MediaSource buildMediaSource(Uri uri) {


DataSource.Factory dataSourceFactory =
                new DefaultDataSourceFactory(MediaPlayerActivity.this, "ua");

        return  new DashMediaSource.Factory(dataSourceFactory)
                .createMediaSource(uri);


    }

и это мои зависимости:

implementation 'com.google.android.exoplayer:exoplayer-core:2.10.0'
    implementation 'com.google.android.exoplayer:exoplayer-dash:2.10.0'
    implementation 'com.google.android.exoplayer:extension-mediasession:2.8.4'
    implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.+'
    implementation 'com.google.android.exoplayer:exoplayer:r2.4.0'
person Sumukha Aithal K    schedule 12.02.2020