Android MediaPlayer неожиданно останавливает воспроизведение (без завершения) - PullRequest
0 голосов
/ 04 мая 2020

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

Есть много похожих вопросов, но они не помогли мне решить мой. (разные)

У меня есть действие, которое воспроизводит видео со звуком, затем отображает изображение в течение 3 секунд, затем отображает анимированный просмотр карты в течение 10 секунд, а затем воспроизводит другое видео.

  • video1 (~ 60se c)
  • изображение (~ 3se c)
  • анимированное отображение карты (~ 10se c)
  • video2 (~ 30se c)

возникла при попытке воспроизведения аудио с момента окончания первого видео. звук воспроизводился нормально во время просмотра карты, затем остановился. Я пробовал все виды сценариев ios, но musi c всегда останавливался, когда что-то менялось, хотя некоторые комбинации работали (например, без карты и видео2 (вместо этого просто черный экран)). Я очень внимательно изучил все журналы, но не нашел ничего полезного.

Проблема в , а не в том, что медиаплеер g c 'd или каким-то образом завершен перед завершением.

private static MediaPlayer mediaplayer;

и в OnCreate:

    mediaplayer = new MediaPlayer();
    AudioFocusRequest.Builder mp;
    mediaplayer.setAudioAttributes(
            new AudioAttributes
                    .Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build());
    try {
        mediaplayer.setDataSource(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.audio));
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("audio_management","error trying to set data source for audio");
    }
    try {
        mediaplayer.prepare();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("audio_management","error preparing");
    }

Вот пример того, как я проигрываю видео

        z.schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    playPart2();
                }
            });
        }
    }, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);

, и это функция playPart2 ():

    public void playPart2() {
    ImageView imgbg =  findViewById(R.id.imageView);
    ImageView agO = findViewById(R.id.agent1);
    ImageView agTw =  findViewById(R.id.agent2);
    ImageView agTh =  findViewById(R.id.agent3);
    ImageView agFo =  findViewById(R.id.agent4);
    ImageView agFi =  findViewById(R.id.agent5);
    ImageView agSi = findViewById(R.id.agent6);
    VideoView player =  findViewById(R.id.videoView);
    MapView mMap = findViewById(R.id.map);

    mMap.setVisibility(View.INVISIBLE);
    imgbg.setVisibility(View.INVISIBLE);
    agO.setVisibility(View.INVISIBLE);
    agTw.setVisibility(View.INVISIBLE);
    agTh.setVisibility(View.INVISIBLE);
    agFo.setVisibility(View.INVISIBLE);
    agFi.setVisibility(View.INVISIBLE);
    agSi.setVisibility(View.INVISIBLE);
    player.setVisibility(View.VISIBLE);


    Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.part2);
    player.setVideoURI(uri);
    player.start();
}

Я действительно не знаю, что происходит - я прочитал всю документацию, касающуюся MediaPlayer и VideoViews. Это говорит о том, что можно выводить 2 потока аудио одновременно. Но это не работает.

1 Ответ

0 голосов
/ 04 мая 2020

получается, что просмотр видео при запуске воспроизведения как-то приостановил медиаплеер. то, что решило проблему, просто снова вызвало mediaplayer.start (). он возобновил там, где остановился все время раньше. (очевидно существующий) короткий перерыв в воспроизведении не заметен.

почему такое поведение медиаплеера / видеовидения нигде не упоминается?

код решения проблемы:

        z.schedule(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    playPart2();
                    mediaplayer.start();
                }
            });
        }
    }, PARTONELENGTH + MAPDISPLAYTIME + IMAGEDISPLAYTIME);
...