Когда я пытаюсь воспроизвести видео из локального файла (я полагаю, это .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>
Почему я не могу зациклить обычный путь? Что я могу сделать, чтобы избавиться от черной рамки или оптимизировать использование процессора?