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
相关产品推荐
相关产品推荐

