1

我正在实现一个音乐应用程序。我在用Exoplayer2

我正在尝试使用DynamicConcatenatingMediaSource动态向播放列表添加和删除项目。

这是我的实现。

public void initMusicPlayer(){

        if (songs !=null)
        {

            MediaSource mediaSource;
            ArrayList<MediaSource> sources = new ArrayList<>();

            MusicItem song;
            for (int i=0;i< songs.size();i++)
            {
                song = songs.get(i);
                mediaSource = buildMediaSource(Uri.parse(song.getMusicUrl()));
                sources.add(mediaSource);
            }

            dynamicMediaSource = new DynamicConcatenatingMediaSource();
            dynamicMediaSource.addMediaSources(sources);
            exoPlayer.prepare(dynamicMediaSource,false,false);

            exoPlayer.addListener(this);
            if (currentPlayingSongIndex == -1)
            {
                exoPlayer.setPlayWhenReady(false);
            }
            else
            {
                exoPlayer.seekTo(currentPlayingSongIndex,0);
                exoPlayer.setPlayWhenReady(true);
            }
        }
    }

public void addItemToPlaylist(MusicItem song,boolean shouldPlay){

        long position = exoPlayer.getContentPosition();
        MediaSource mediaSource = buildMediaSource(Uri.parse(song.getMusicUrl()));
        dynamicMediaSource.addMediaSource(mediaSource);
        exoPlayer.prepare(dynamicMediaSource,false,false);

        if (shouldPlay)
        {
            exoPlayer.seekTo(currentPlayingSongIndex,0);
        }
        else
        {
            exoPlayer.seekTo(currentPlayingSongIndex,position);
        }
    }

但是,这个实现不起作用。它什么都不播放。

上面的代码有什么问题?

另外,如何将项目动态添加到播放列表?上述addItemToPlaylist工作会吗?

4

1 回答 1

0

这是我创建的用于在 Kotlin 中播放 mp3 文件的播放列表的功能。(您可以在Android Studio中复制粘贴它,如果您使用Java,它将转换为Java)

private fun mediaPlayerConfiguration() {
    val bandwidthMeter = DefaultBandwidthMeter()
    val extractorsFactory = DefaultExtractorsFactory()
    val trackSelectionFactory = AdaptiveTrackSelection.Factory(bandwidthMeter)
    val trackSelector = DefaultTrackSelector(trackSelectionFactory)
    val defaultBandwidthMeter = DefaultBandwidthMeter()
    val dataSourceFactory = DefaultDataSourceFactory(this,
            Util.getUserAgent(this, "mediaPlayerSample"), defaultBandwidthMeter)

    val dynamicConcatenatingMediaSource = DynamicConcatenatingMediaSource()

    for (item in myActivity.list) {
        var mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).setExtractorsFactory(extractorsFactory).createMediaSource(Uri.parse(item))
        dynamicConcatenatingMediaSource.addMediaSource(mediaSource)
    }

    mPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector)
    mPlayer.prepare(dynamicConcatenatingMediaSource)

    mPlayer.playWhenReady = true
}
于 2018-05-02T08:52:50.310 回答