Exoplayer: Loop создает OutOfMemoryError при воспроизведении видео из локального файла - PullRequest
0 голосов
/ 06 ноября 2019

Когда я пытаюсь воспроизвести видео из локального файла (я полагаю, это .mp4) в ExoPlayer 2.10.6, я получаю OutOfMemoryError. Я загружаю видео из firebase БД, а затем загружаю его с Exoplayer. fragment с Exoplayer существует дважды, но я выпускаю Exoplayer в onPause.

Здесь, где я инициализирую, Exoplayer, displayVideo вызывается в onResume и позжев то время как fragment работает:

private void displayVideo() {       
    releaseMediaPlayer();
    exoPlayer = ExoPlayerFactory.newSimpleInstance(getContext());      
    mMediaPlayerView.setPlayer(exoPlayer);
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(), com.google.android.exoplayer2.util.Util.getUserAgent(getContext(), getContext().getString(R.string.app_name)));
    MediaSource videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.fromFile(new File(getContext().getExternalFilesDir(null), profilePicVideoName)));
    exoPlayer.prepare(videoSource);
    exoPlayer.setPlayWhenReady(true);
    exoPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);
    mMediaPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
}

Здесь, где я выпускаю Exoplayer:

@Override
public void onPause() {
    super.onPause();
    releaseMediaPlayer();
}

@Override
public void onDestroy() {
    super.onDestroy();
    releaseMediaPlayer();
}

private void releaseMediaPlayer() {
    if (exoPlayer != null) {
        exoPlayer.release();
        exoPlayer = null;
    }
    mMediaPlayerView.setPlayer(null);
}

Видео-файл в firebase имеет размер <1 МБ. </p>

Редактировать:

new File(getContext().getExternalFilesDir(null), Helper.profilePicVideoName).length() = 629440

И сообщение об ошибке довольно бесполезно:

E/art: Throwing OutOfMemoryError "Failed to allocate a 65548 byte allocation with 10220 free bytes and 9KB until OOM"
E/LoadTask: OutOfMemory error loading stream
java.lang.OutOfMemoryError: Failed to allocate a 65548 byte allocation with 19092 free bytes and 18KB until OOM

Редактировать 2:

Хорошо, без цикла видео, OutOfMemoryError не выбрасывается. Не имеет значения, если я зациклю видео с setRepeatMode, с LoopingMediaSource или добавив прослушиватель, который вызывает exoPlayer.prepare.

Единственное, что останавливает OutOfMemoryError, это добавлениеслушатель, и с каждым циклом, чтобы освободить все с releaseMediaPlayer(), а затем заново создать Exoplayer, Mediasource и так далее. Но тогда между каждой петлей появляется черная рамка, и процессор используется гораздо больше, чем необходимо. Потребление памяти снижается DRASTICALLY со 180 МБ, где OutOfMemory встречается до <100 МБ. </p>

Почему я не могу зациклить обычный путь? Что я могу сделать, чтобы избавиться от черной рамки или оптимизировать использование процессора?

...