Звук продолжает воспроизводиться, когда exoplayer выпускает

Я использую Exoplayer в своем диалоге. Я хочу, чтобы видео воспроизводилось автоматически при открытии диалогового окна. Когда simpleExoPlayer.prepare() фрагмент активен, я могу запустить автовоспроизведение, но когда я закрываю диалоговое окно, звук продолжает воспроизводиться. Перед активацией simpleExoPlayer.prepare() звук останавливается, когда я закрываю диалог. Есть ли другой способ автоматического воспроизведения exoplayer или остановки звука при закрытии диалога?

class VideoViewDialog (context: Context) : BaseDialog<LayoutDialogVideoViewBinding>(context) {


private var videoUrl : String = ""
private lateinit var simpleExoPlayer: ExoPlayer

override fun populateUi() {
    setCanceledOnTouchOutside(true)
    mBinding?.apply {

        initializePlayer()
    }
}


private fun initializePlayer() {
    val mediaDataSourceFactory: DataSource.Factory = DefaultDataSource.Factory(context)

    val mediaSource = ProgressiveMediaSource.Factory(mediaDataSourceFactory).createMediaSource(
        MediaItem.fromUri(videoUrl))

    val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(mediaDataSourceFactory)

    simpleExoPlayer = ExoPlayer.Builder(context)
        .setMediaSourceFactory(mediaSourceFactory)
        .build()

    simpleExoPlayer.addMediaSource(mediaSource)

    simpleExoPlayer.playWhenReady = true
    simpleExoPlayer.prepare()

    mBinding?.apply {

        playerView.player = simpleExoPlayer
        playerView.requestFocus()


    }
    simpleExoPlayer.play()

}

private fun releasePlayer() {
    simpleExoPlayer.release()
}

public override fun onStart() {
    super.onStart()

    if (Util.SDK_INT > 23) initializePlayer()
}

public override fun onStop() {
    super.onStop()

    if (Util.SDK_INT > 23) releasePlayer()
}

override fun getLayoutRes(): Int {
    return R.layout.layout_dialog_video_view
}


companion object{
    fun newInstance(
        context: Context,
        videoUrl : String,
    ) : VideoViewDialog{
        val dialog = VideoViewDialog(context)
        dialog.also {
            it.videoUrl = videoUrl
        }
        return dialog
    }
}
}

Пробовал .stop, clearVideoSurface(), playerView.player = null до .release(). Не работает

BaseDialog поддерживает переопределение события onDismiss(), если разработчик хочет что-то сделать, когда диалоговое окно закрыто.

emandt 23.03.2022 15:55

@emandt, выпускающий exoplayer на onDismiss(), также не работает

Alperen Acikgoz 23.03.2022 17:24

Вы проверяли, выполняется ли "onDismiss()" во время выполнения? Вы пытались вызвать ".stop()" перед ".release()"?

emandt 23.03.2022 17:27

@emandt onDismiss() выполняется. Я пробовал ".stop", "clearVideoSurface()", "playerView.player = null" перед ".release()". Не работает

Alperen Acikgoz 23.03.2022 17:48
1
4
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вы дважды звонили initializePlayer(). в результате воспроизводятся два экземпляра Exoplayer; вы можете освободить только тот, на который ссылается переменная simpleExoPlayer.

Я объявил simpleExoPlayer как глобальную переменную lateinit и инициализировал ее в функции initializePlayer(). Эта функция работает под populateUi() . Похоже, simpleExoPlayer инициализировался под populateUi() только один раз.

Alperen Acikgoz 23.03.2022 20:26

похоже, вы также вызвали это в onStart (), изменение переменной не означает ее уничтожение. ExoPlayer поддерживает себя с помощью ApplicationContext, поэтому он будет оставаться активным до тех пор, пока приложение не умрет или ресурс, который включает ссылку на контекст, не будет освобожден путем вызова release()

Aiden 23.03.2022 20:29

Другие вопросы по теме