You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XamarinMediaManager:设置MediaQueue的CurrentIndex无效问题求助

解决XamarinMediaManager播放队列起始位置设置问题

我正好遇过类似的困扰,咱们一步步把这个问题搞定!你尝试的两种方法没生效,核心原因是播放流程的时机没把控好——要么是先触发播放导致索引被重置,要么是异步操作没完成就修改了索引。

为什么你的代码没生效?

  • 示例1里,你先调用Play(media),这时候MediaManager会自动初始化队列并启动播放第一个音频(A),之后再修改CurrentIndex=1会被播放的初始化流程覆盖,所以没效果。
  • 示例2里,手动添加队列后设置了索引,但最后调用的Prepare()只是完成播放准备,没有明确触发从当前索引项开始播放;而且如果CreateMediaItem的异步操作没全部完成就设置索引,也会导致队列状态异常。

正确的实现方式

这里有两种靠谱的方案,你可以选适合自己的:

方案1:先构建完整队列,设置索引再播放

这种方式更可控,确保所有媒体项都加载完成后再指定起始位置:

// 1. 异步创建所有媒体项,确保全部加载完成
var extractor = CrossMediaManager.Current.MediaExtractor;
var mediaItems = new List<IMediaItem>
{
    await extractor.CreateMediaItem(pathA),
    await extractor.CreateMediaItem(pathB),
    await extractor.CreateMediaItem(pathC)
};

// 2. 清空现有队列并添加新项
CrossMediaManager.Current.MediaQueue.Clear();
foreach (var item in mediaItems)
{
    CrossMediaManager.Current.MediaQueue.Add(item);
}

// 3. 设置起始播放索引(这里是B,索引为1)
CrossMediaManager.Current.MediaQueue.CurrentIndex = 1;

// 4. 启动播放
await CrossMediaManager.Current.Play();

方案2:直接用Play重载指定起始项和完整队列

这个方法更简洁,利用MediaManager的内置重载,直接告诉它要播放的项和整个队列:

var mediaPaths = new List<string> { pathA, pathB, pathC };
// 第一个参数是要开始播放的项,第二个是完整队列
await CrossMediaManager.Current.Play(mediaPaths[1], mediaPaths);

这样播放会直接从B开始,队列里包含A、B、C,按上一曲自然就能回到A,完美符合你的需求!

额外注意点

  • 确保所有异步操作(比如CreateMediaItem)都用await等待完成,避免队列还没构建好就操作索引。
  • 如果是Android平台,有些设备的MediaController状态需要同步,设置索引后调用Play()比单独调用Prepare()更可靠。

内容的提问来源于stack exchange,提问作者user5295546

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:07:30