我的用例是我有一个 mp3 文件在后台播放,它在颤动中使用 audio_service 和 just_audio 包。假设文件是“A”。
我的应用程序让“A”从 url 下载到本地文件,同时从 url 播放“A”(单独的后台任务)。
系列步骤:
- just_audio 从 url 播放“A”(例如 https://something/A.mp3)
- 'A' 从 url 下载到我的文件 (file:///something/A.mp3)
- “A”仍在后台播放。
- 下载“A”后,我想将播放器的音频源从 http uri 更改为文件 uri。
当我使用队列时,我使用 concatenatingAudioSource 来设置播放器的来源。
我试图删除旧的 uri 并添加新的 uri 并在更改 uri 之前恢复状态。(如下)
bool isPlaying = _player.playing;
Duration position = _player.position;
int index = params['index'];
bool isCurrentItem = _player.currentIndex == index;
await concatenatingAudioSource.removeAt(index);
await concatenatingAudioSource.insert(
index, AudioSource.uri(Uri.parse(params['uri'])));
updateUriInQueue();
// broadcast the queue
await AudioServiceBackground.setQueue(queue);
// Note: a small break might occur when changing the state
// return to it's original state after changing uri
if (!isCurrentItem) return;
await _player.seek(position, index: index);
if (isPlaying) _player.play();
附带说明一下,我不使用 mediaItem.id 作为 URI 并将其存储在 mediaItem.extras 中。
从上面的代码可以清楚的看出,在uri改变后播放器停止播放。我想知道是否有更流畅的方法来更改播放器 uri 而不会干扰输出。