我想将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作为时间表和清单,一切都开始起作用了.
在从数组到列表的转换过程中,这是我的错.
我不得不使用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