android – Exoplayer 2的动态播放列表

前端之家收集整理的这篇文章主要介绍了android – Exoplayer 2的动态播放列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我想将ExoPlayer2与播放列表一起使用,可以动态地改变音轨(在播放列表中添加删除它们)并更改循环设置.

由于ConcatenatingMediaSource有静态数组(而不是列表),我正在实现一个DynamicMediaSource,比如连接一个但是用列表而不是数组和一个模式方法addSource来向列表添加一个以上的媒体源.

public void addSource(MediaSource mediaSource) {
    this.mediaSources.add(mediaSource);
    duplicateFlags = buildDuplicateFlags(this.mediaSources);
    if(!mediaSources.isEmpty())
        prepareSource(mediaSources.size() -1);
    else
        prepareSource(0);
}

当我调用addSource时

                MediaSource ms = buildMediaSource(mynewuri,null);
                mediaSource.addSource(ms);

轨道被添加到数组但似乎缺少某些东西,因为我总是在createPeriod方法中获得ArrayOutOfBoundsException.

在createPeriod中的方法

mediaSources.get(sourceIndex)...

正在尝试访问index = mediaSources.size().

你能帮助我吗?

最佳答案
我最终成功了.
在从数组到列表的转换过程中,这是我的错.
我不得不使用SparseArrays作为时间表和清单,一切都开始起作用了.

在DynamicMediaSource中,只需设置以下类型:

private final List

您必须使用稀疏数组将正确的值设置为方法中的时间轴和清单

private void handleSourceInfoRefreshed(int sourceFirstIndex,Timeline sourceTimeline,Object sourceManifest) {
    // Set the timeline and manifest.
    timelines.put(sourceFirstIndex,sourceTimeline);
    manifests.put(sourceFirstIndex,sourceManifest);

    // Also set the timeline and manifest for any duplicate entries of the same source.
    for (int i = sourceFirstIndex + 1; i < mediaSources.size(); i++) {
        if (mediaSources.get(i).equals(mediaSources.get(sourceFirstIndex))) {
            timelines.put(i,sourceTimeline);
            manifests.put(i,sourceManifest);
        }
    }

    for(int i= 0; i

以下是DynamicMediaSource类的完整代码

public final class DynamicMediaSource implements MediaSource {

private static final String TAG = "DynamicSource";

private final List

猜你在找的Android相关文章