我有ExoPlayerWrapper类,它是ExoPlayer的包装器,由Dagger单例注入(inject)。 ExoPlayerWrapper类中的Init块的外观如下:

@Singleton
class ExoPlayerWrapper @Inject constructor(
    context: Context,
    userAgentInfo: UserAgentInfo
) {
    private val exoPlayer: ExoPlayer
    private val httpDataSource: HttpDataSource
    private val mediaSourceFactory: ExtractorMediaSource.Factory

    override val exoPlayerInstance: ExoPlayer
        get() = exoPlayer

   init {
        ...
        exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)
        httpDataSource = CustomHttpDataSource(userAgentInfo.userAgent, null)
        mediaSourceFactory = ExtractorMediaSource.Factory { httpDataSource }
        state = Player.STATE_IDLE
    }

   override fun playFromUrl(uri: Uri, headers: Map<String, String>) {
        reset()
        ...
        val mediaSource = mediaSourceFactory.createMediaSource(uri)
        exoPlayer.prepare(mediaSource)
        exoPlayer.playWhenReady = true
    }

    override fun pause() {
        exoPlayer.playWhenReady = false
    }

    override fun reset() {
       stop()
       state = Player.STATE_IDLE
    }

    override fun stop() {
       exoPlayer.stop()
       exoPlayer.seekTo(0)
    }

    override fun seekTo(position: Long) {
       exoPlayer.seekTo(position)
    }

    ...

    override fun release() {
        exoPlayer.release()
        state = Player.STATE_RELEASED
    }

onCreate()Activity方法中,我有以下代码:
public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_video_player)
    ...
    if (savedInstanceState != null) {
        initialized = savedInstanceState.getBoolean(INITIALIZED)
    }
    if (!initialized) {
        val uri = Uri.parse(attachedVideo?.uri)
        player.playFromUrl(uri, sessionStore.sessionHeaders)
        videoView.requestFocus()
        initialized = true
    }

    videoView.player = player.exoPlayerInstance

    backBtn.setOnClickListener{ _ ->
        player.release()
        finish()
    }
}

但是在这种情况下,单击backBtn按钮后我只能播放一个视频,此后其他视频将不播放,直到我关闭应用程序并再次重新打开应用程序。如果我以以下方式更改backBtn's OnClickListener:
backBtn.setOnClickListener{ _ ->
    player.pause()
    finish()
}

一切正常,点击backBtn按钮后播放其他视频。因此,在调用ExoPlayer方法之后,重新初始化release()似乎存在问题。以及释放后如何正确重新初始化ExoPlayer?

UPD
release()调用之后,并尝试再次打开视频后,我在Logcat中看到以下错误:

最佳答案

该问题是由于尝试使用已释放资源的播放器而引起的。因为:

exoPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector)

ExoPlayerWrapper初始化期间仅被调用一次。如果您的 Activity 没有重新开始,则ExoPlayerWrapper实例将与释放的播放器一起存在。

您可以在每次播放视频时创建一个新的ExoPlayerWrapper实例,或者在ExoPlayerWrapper中创建一个播放器初始化方法,可以在播放视频之前调用该方法。

07-24 19:04