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

如何在ConcatenatingAudioSource的每个音频后添加2秒延迟?求方法指引

在ConcatenatingAudioSource中实现音频间2秒延迟的方法

ConcatenatingAudioSource本身没有内置的音频间延迟配置,但可以通过以下两种常用方法实现需求:

方法一:插入静音音频源作为延迟占位符

生成一个2秒的静音音频片段,将其作为独立的AudioSource插入到每段目标音频之间,利用静音播放实现延迟效果。

示例代码(基于just_audio包):

// 方式1:使用提前准备好的本地静音文件
final silenceSource = AudioSource.uri(Uri.parse('asset:///assets/silence_2s.mp3'));

// 构建串联音频列表,每个目标音频后添加静音源
final concatenatedSource = ConcatenatingAudioSource(
  children: [
    AudioSource.uri(Uri.parse('audio1.mp3')),
    silenceSource,
    AudioSource.uri(Uri.parse('audio2.mp3')),
    silenceSource,
    // 后续音频按此模式添加
  ],
);

// 加载并播放
await player.setAudioSource(concatenatedSource);
player.play();

如果不想依赖本地文件,也可以通过生成内存中的PCM静音数据来创建AudioSource:

// 生成2秒单声道、44100Hz的PCM静音数据
const sampleRate = 44100;
const duration = Duration(seconds: 2);
final samples = List<int>.filled(sampleRate * duration.inSeconds * 2, 0); // 16位PCM
final silenceSource = AudioSource.memory(
  Uint8List.fromList(samples),
  codec: Codec.pcm16,
);

这种方法逻辑简单,无需处理复杂的状态监听,适合固定延迟的场景。

方法二:监听播放状态,手动添加延迟

通过监听播放器的播放状态,在当前音频播放完成后触发2秒延迟,再自动切换到下一段音频。

示例代码:

// 监听播放状态变化
player.processingStateStream.listen((state) {
  if (state == ProcessingState.completed) {
    final currentIndex = player.currentIndex;
    // 检查是否还有下一段音频
    if (currentIndex != null && currentIndex < concatenatedSource.children.length - 1) {
      // 延迟2秒后播放下一段
      Future.delayed(const Duration(seconds: 2), () {
        player.seekToNext();
      });
    }
  }
});

// 加载串联源并播放
await player.setAudioSource(concatenatedSource);
player.play();

注意事项:

  • 如果用户手动触发播放/暂停、跳转操作,需要额外处理延迟任务的取消,避免逻辑冲突
  • 可以使用Timer替代Future.delayed,方便在需要时取消延迟任务

这种方法无需额外音频资源,灵活性更高,但需要处理更多播放状态的边界情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:16:00