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

Flutter Just Audio:如何用循环动态生成ConcatenatingAudioSource

动态生成ConcatenatingAudioSource的实现方案

核心思路是:先整理音频资源的路径/标识列表,通过循环遍历该列表,复用统一的AudioSource.uri模板生成音频源,再批量添加到ConcatenatingAudioSource中,替代硬编码的写法。

以下是两种常见场景的具体实现:

场景1:从项目assets资源中动态生成

首先确保已在pubspec.yaml中配置好音频资源路径:

flutter:
  assets:
    - assets/audio/

然后通过文件名列表循环生成音频源:

import 'package:just_audio/just_audio.dart';

// 定义assets中的音频文件名列表
final audioFileNames = ['track1.mp3', 'track2.mp3', 'track3.mp3'];

// 初始化拼接音频源
final concatenatingSource = ConcatenatingAudioSource(children: []);

// 循环生成并添加音频源
for (final fileName in audioFileNames) {
  // 复用统一的AudioSource.uri模板,仅替换文件名变量
  final singleSource = AudioSource.uri(
    Uri.parse('asset:///assets/audio/$fileName'),
  );
  concatenatingSource.add(singleSource);
}

// 绑定到音频播放器
final player = AudioPlayer();
await player.setAudioSource(concatenatingSource);

场景2:从本地文件目录中动态生成

如果音频文件存储在应用可访问的本地目录(比如文档目录),可以先扫描目录获取文件列表,再循环生成:

import 'package:just_audio/just_audio.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';

// 获取本地目录下的所有音频文件
Future<List<File>> getLocalAudioFiles() async {
  final docDir = await getApplicationDocumentsDirectory();
  return docDir.listSync()
      .where((item) => item is File && item.path.endsWith('.mp3'))
      .cast<File>()
      .toList();
}

// 动态生成拼接音频源
Future<void> setupDynamicAudioSource() async {
  final audioFiles = await getLocalAudioFiles();
  final concatenatingSource = ConcatenatingAudioSource(children: []);

  for (final file in audioFiles) {
    // 复用统一模板,替换为本地文件路径
    final singleSource = AudioSource.uri(Uri.file(file.path));
    concatenatingSource.add(singleSource);
  }

  final player = AudioPlayer();
  await player.setAudioSource(concatenatingSource);
}

如果是网络音频资源,只需将列表替换为网络URL字符串,再通过Uri.parse(url)传入模板即可,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:50:37