Воспроизведение плейлистов Dynami c DA SH с помощью ExoPlayer - PullRequest
0 голосов
/ 30 мая 2020

для создания сеанса прямой трансляции из очень плохой полосы пропускания я генерирую из нескольких сегментов потока rtmp сегмент mp4 evry 40 se c и преобразовал каждый из них в один файл mpd, поэтому у меня есть эта структура со стороны сервера

-rw-r--r-- 1 nginx nginx 322714 May 29 13:48 0_dashinit.mp4
-rw-r--r-- 1 nginx nginx 328564 May 29 13:48 0.mp4
-rw-rw-rw- 1 nginx nginx   1263 May 29 13:49 1.mpd
-rw-r--r-- 1 nginx nginx 336904 May 29 13:49 1_dashinit.mp4
-rw-r--r-- 1 nginx nginx 342958 May 29 13:48 1.mp4
-rw-rw-rw- 1 nginx nginx   1263 May 29 13:49 1.mpd
-rw-r--r-- 1 nginx nginx 337680 May 29 13:50 2_dashinit.mp4
-rw-r--r-- 1 nginx nginx 343774 May 29 13:49 2.mp4
-rw-rw-rw- 1 nginx nginx   1263 May 29 13:50 2.mpd

у меня вопрос, как читать каждую из них в exoplayer, как будто я играю в плейлист. Я пробую этот подход ниже, но после завершения первого файла mpd exoplayer не переключается на следующий mpd

      int k = 0 ;
      String mpdurl = "http://MY_IP_SERVER_ADRESS/dash/" + Endpoind + "/" + k + ".mpd";
      initializePlayer(mpdurl )


      private void initializePlayer(String url ) {

        DemoPlayer.RendererBuilder DashrendererBuilder = new DashRendererBuilder(getApplicationContext(), "live", url, null);

        player = new DemoPlayer(DashrendererBuilder);

        player.prepare();
        player.setPlayWhenReady(true);

        player.addListener(new DemoPlayer.Listener() {
            @Override
            public void onStateChanged(boolean playWhenReady, int playbackState) {

                if (playWhenReady && playbackState == STATE_READY) {
                    if (currentPositionTracker == null) {
                        registerCurrentPositionTracker();
                    }
                    ToastFromHandler("Playback is playing");
                    playerstate = "playing";
                } else if (playWhenReady) {
                    if (player.getDuration() != 0 && player.getDuration() <= player.getCurrentPosition()) {

                     unRegisterCurrentPositionTracker();
                     playerstate = "hascompleted";
                     releasePlayer();
                     k++;  // increment indice to switch to next mpd file when previous mpd has completed
                     initializePlayer(mpdurl);

                    } else {
                        //The player is not able to immediately play from its current position. This mostly happens because more data needs to be loaded.
                        //Create a custom load control which continuously keeps the buffer filled up based on max buffer — a technique called Drip-Feeding.
                        ToastFromHandler("Playback is buffering or paused automatically");
                        playerstate ="buffering";

                    }
                } else {
                    unRegisterCurrentPositionTracker();
                    ToastFromHandler("Playback is paused");
                    playerstate ="paused";
                }
            }

            @Override
            public void onError(Exception e) {

            }

            @Override
            public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {

            }
        });

    }

Любая поддержка приветствуется. спасибо

...