ExoPlayer 2播放列表监听器

时间:2016-10-27 12:37:44

标签: android exoplayer

我使用ExoPlayer 2.x的新功能播放如下音频文件列表:

List<MediaSource> playlist = new ArrayList<>();

...

ConcatenatingMediaSource concatenatedSource = new ConcatenatingMediaSource(
            playlist.toArray(new MediaSource[playlist.size()]));

mExoPlayer.prepare(concatenatedSource);
mExoPlayer.setPlayWhenReady(true);

这很好用,但是为了相应地更新我的UI,我需要知道当前正在播放哪首曲目以及该曲目的进度。是否有来自ExoPlayer的听众?

谢谢!

4 个答案:

答案 0 :(得分:10)

所以我处于类似场景,需要知道播放列表中的下一个视频何时开始播放。我发现local srv=net.createServer(net.TCP) local function receiver(sck,numbers) local p={} for v,n in (numbers or ''):gmatch("([x-z])=(%d+)") do print (("%s=%s"):format(v,n)) p[v]=n+0 end -- processReq(p.x, p.y, p.z) print(collectgarbage("count")*1024) collectgarbage("collect") sck:close() end if svr then srv:listen(6969,function(conn) conn:on("receive",receiver) end) end 有一个名为ExoPlayer.EventListener的方法,每次视频更改时都会调用该方法,或者&#34;寻找&#34;到播放列表中的下一个。

我还没有充分利用这种方法,但从目前为止我所看到的,这是你应该关注的方法。触发方法时没有传递任何参数,因此您必须保留某种计数器或队列以跟踪在任何给定时刻播放的内容。

希望这有帮助!

修改: onPositionDiscontinuity()返回的索引更改是recommended way,用于检测播放列表Exoplayer.getCurrentWindowIndex()中的项目更改。

MediaSource

答案 1 :(得分:8)

您可以根据玩家的状态实施以下事件并更新您的UI。

 mExoPlayer.addListener(new ExoPlayer.Listener() {
            @Override
            public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                if (playbackState == PlaybackStateCompat.STATE_PLAYING) {
                    //do something                 
                }
            }

            @Override
            public void onPlayWhenReadyCommitted() {

            }

            @Override
            public void onPlayerError(ExoPlaybackException error) {
                mExoPlayer.stop();

            }
        });

答案 2 :(得分:0)

由于这里的答案对我不起作用,我将在 Kotlin 中添加我的工作解决方案。 而且还有很多方法从那时起就被弃用了。

您可以通过在创建播放列表时设置 mediaId 来跟踪当前曲目(视频)

摇篮:

implementation 'com.google.android.exoplayer:exoplayer:2.14.1'

布局xml:

<com.google.android.exoplayer2.ui.PlayerView
    android:id="@+id/player_view"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    app:show_buffering="when_playing"/>

代码:

private lateinit var exoPlayer: SimpleExoPlayer
private lateinit var playerView: PlayerView
private lateinit var fileList: List<FileModel>

private fun initPlayer() {
    playerView = findViewById(R.id.player_view)
    playerView.controllerShowTimeoutMs = 0
    playerView.cameraDistance = 30F
    exoPlayer = SimpleExoPlayer.Builder(this).build()
    playerView.player = exoPlayer

    setPlaylist()
    exoPlayer.prepare()
    exoPlayer.seekTo(position, C.TIME_UNSET) // position = current song or video
    exoPlayer.playWhenReady = true
    addPlayerListeners()
}

private fun setPlaylist() {
    for ((pos, file) in fileList.withIndex()) {
        val mediaItem = MediaItem.Builder().setUri(file.url).setMediaId(pos.toString()).build()
        exoPlayer.addMediaItem(mediaItem)
    }
}

private fun addPlayerListeners() {
    exoPlayer.addListener(object : Player.Listener{
        override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
            super.onMediaItemTransition(mediaItem, reason)
            val  item = mediaItem?.mediaMetadata
            val bmp = item?.artworkData
            Log.i(TAG, "position = ${mediaItem?.mediaId}")
            val currentPos = mediaItem?.mediaId
            updateViews(currentPos, bmp)
        }
    })
}

private fun updateViews(currentPos: String?, bmp: ByteArray?) {
    position = currentPos?.toInt() ?: 0
    val title = fileList[position].title
    textview_title.text = title

    if (bmp == null) {
        image_view.setImageResource(R.drawable.exo_ic_default_album_image)
        return
    }
    val bitmap = BitmapFactory.decodeByteArray(bmp, 0, bmp.size)
    image_view.setImageBitmap(bitmap)
}

答案 3 :(得分:-3)

凭借我有限的知识

你能尝试吗

MediaPlayer.TrackInfo 

MediaPlayer.TrackInfo Details toString()应该为您提供所需的信息