如何在 android 中实现 Exoplayer 2.11.1?

Chi*_*tel 9 android audio-player android-music-player exoplayer exoplayer2.x

我正在尝试实现exoplayer这是我的exoplayer版本

implementation 'com.google.android.exoplayer:exoplayer:2.11.1'
Run Code Online (Sandbox Code Playgroud)

我正在创建一个音乐播放器应用程序,但我对过去 2 天exoplayer尝试实施的内容一无所知,exoplayer但它不起作用。我无法理解官方文档中的任何内容。

我找到了很多示例和教程,但都是关于使用exoplayer. 许多示例都使用不推荐使用的方法。

我正在尝试使用本教程来实现,但许多方法已被弃用,因此它不适用于 EX。

simpleExoplayer = ExoPlayerFactory.newSimpleInstance(
            DefaultRenderersFactory(this),
            DefaultTrackSelector(adaptiveTrackSelectionFactory),
            DefaultLoadControl()
        )
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议我从哪里开始或如何使用最新版本的 exoplayer.

任何帮助将不胜感激。

Chr*_*ona 16

通过新的更新,您可以使用SimpleExoPlayer.Builder以下命令创建一个简单的播放器实例:

simpleExoplayer = SimpleExoPlayer.Builder(context).build()
Run Code Online (Sandbox Code Playgroud)

您还可以提供Builder具有不同参数的 。请参阅https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html

您可以使用我创建的这个简单的自定义类来帮助您入门。

class ExoPlayerHelper(
    private val playerView: PlayerView,
    onError: (ExoPlaybackException) -> Unit,
    onPlayerBuffer: (Boolean) -> Unit
) {

    private var exoPlayer: ExoPlayer? = null
    private var mediaSource: ProgressiveMediaSource? = null

    private val playerListener = object : Player.EventListener {
        override fun onPlayerError(error: ExoPlaybackException) {
            super.onPlayerError(error)
            onError(error)
        }

        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
            super.onPlayerStateChanged(playWhenReady, playbackState)
            onPlayerBuffer(playbackState == Player.STATE_BUFFERING)
        }
    }

    fun initializePlayer(url: String) {
        exoPlayer = SimpleExoPlayer.Builder(playerView.context).build()
        exoPlayer!!.repeatMode = Player.REPEAT_MODE_ALL
        exoPlayer!!.addListener(playerListener)

        playerView.player = exoPlayer

        val userAgent =
            Util.getUserAgent(playerView.context, playerView.context.getString(R.string.app_name))
        mediaSource = ProgressiveMediaSource
            .Factory(
                DefaultDataSourceFactory(playerView.context, userAgent),
                DefaultExtractorsFactory()
            )
            .createMediaSource(Uri.parse(url))

        exoPlayer!!.prepare(mediaSource!!, true, false)
        exoPlayer!!.playWhenReady = true
    }

    private fun killPlayer() {
        if (exoPlayer != null) {
            exoPlayer!!.release()
            exoPlayer = null
            mediaSource = null
            playerView.player = null
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我也遇到了这个问题,这是我的解决方案

宣言

private val exoPlayer: SimpleExoPlayer by lazy { SimpleExoPlayer.Builder(this).build()}
Run Code Online (Sandbox Code Playgroud)

播放歌曲

private fun prepareExoPlayerFromURL(url: String) {
        val dataSourceFactory =
            DefaultDataSourceFactory(this, Util.getUserAgent(this, resources.getString(R.string.app_name)), null)
        val extractorsFactory = DefaultExtractorsFactory()
//        val audioSource = ExtractorMediaSource(uri, dataSourceFactory, extractorsFactory, null, null)

        val concateMediaSource = ConcatenatingMediaSource()

        // to play from song list
        for (i in mSongList) {      // song list song arraylist
            val mediaSource = ProgressiveMediaSource
                .Factory(
                    DefaultDataSourceFactory(this, dataSourceFactory),
                    DefaultExtractorsFactory()
                )
                .createMediaSource(Uri.parse(i.musicFile)/*Uri.parse(i.uri)*/)
            concateMediaSource.addMediaSource(mediaSource)
        }

        // to play single song
       /* val audioSource = ProgressiveMediaSource
            .Factory(
                DefaultDataSourceFactory(this, dataSourceFactory),
                DefaultExtractorsFactory()
            )
            .createMediaSource(Uri.parse(url))*/

        exoPlayer.prepare(concateMediaSource/*audioSource*/)
        exoPlayer.seekToDefaultPosition(songPosition)
        exoPlayer.playWhenReady = true

        setNotification()
    }
Run Code Online (Sandbox Code Playgroud)

设置播放器和通知的监听器

private fun setListoner() {
        exoPlayer.addListener(object : Player.EventListener {
            override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
                when (playbackState) {
                    Player.STATE_BUFFERING -> Log.e(TAG,"STATE_BUFFERING")
                    Player.STATE_ENDED -> Log.e(TAG,"STATE_ENDED")
                    Player.STATE_IDLE -> Log.e(TAG,"STATE_IDLE")
                    Player.STATE_READY ->{
                        if (playWhenReady) {
                            Log.e(TAG, "PlaybackStatus.PLAYING")
                        } else {
                            Log.e(TAG, "PlaybackStatus.PAUSED")
                        }
                    }
                    else -> Log.e(TAG,"PlaybackStatus.IDLE")
                }
            }
        })
    }
Run Code Online (Sandbox Code Playgroud)

杀死玩家

 private fun onDestroy() {
        if (exoPlayer != null) {
            exoPlayer.release()
            exoPlayer = null
            mediaSource = null
        }
    }
Run Code Online (Sandbox Code Playgroud)

更详细的内容可以查看官方文档

通用音乐播放器使用ExoPlayer 进行本地音频播放。

使用 ExoPlayer 构建功能丰富的媒体应用程序 (Google I/O '18)