【问题标题】:How to merge two audio files with just_audio for playing both at the same time?如何将两个音频文件与 just_audio 合并以同时播放?
【发布时间】:2021-02-26 02:57:06
【问题描述】:

如何使用 just_audio 合并(而不是连接)两个音频文件以同时播放?

我想合并它以避免同时播放 just_audio 实例的硬件限制。只玩一个 just_audio 实例。

【问题讨论】:

  • @RyanHeise,不,我想合并它以避免同时播放 just_audio 实例的限制。只玩一个 just_audio 实例。
  • 问题变了吗?如果现在的问题是关于避免限制,答案是没有办法避免限制。如果同时合并 N 个音频源,则需要 N 个解码器。每个解码器在 just_audio 中代表一个 AudioPlayer 实例这一事实并没有为解决问题所需的最低资源增加任何额外的东西,因此请随意创建所需的实例数量,直到达到同时数量的限制设备可以处理的解码器。
  • @RyanHeise,我的意思是我想获得第一个文件的波形加上第二个文件的波形,以仅使用 just_audio 的一个实例播放输出波形。
  • 理论上我可以为您重新设计 just_audio 以便在单个实例中执行此操作。但问题是,在一个 just_audio 实例中混合两个音频源仍然会使用双倍的资源,因为正如我上面已经说过的,没有办法避免硬件限制。如果您将气泡向下推到某个地方,它会在其他地方弹出。当谈到解码音频所需的硬件资源时,它并不是免费的。解码两个波形的工作量是解码一个波形的两倍,因此一次同时完成的工作量显然是有限的。

标签: flutter just-audio


【解决方案1】:

我发现连接多个音频文件的唯一方法是使用 ffmpeg。 将此添加到您的 pub.dev flutter_ffmpeg 并将此类添加到您的 lib 文件夹:

class FFmpeg {

  static Future<File> concatenate(List<String> assetPaths, {String output = "new.mp3"})async{

    final directory = await getTemporaryDirectory();
    final file = File("${directory.path}/$output");

    final ffm = FlutterFFmpeg();
    final cmd = ["-y"];
    for(var path in assetPaths){
      final tmp = await copyToTemp(path);
      cmd.add("-i");
      cmd.add(tmp.path);
    }

    cmd.addAll([
      "-filter_complex",
      "[0:a] [1:a] concat=n=${assetPaths.length}:v=0:a=1 [a]",
      "-map", "[a]", "-c:a", "mp3", file.path
    ]);

    await ffm.executeWithArguments(cmd);
    return file;
  }

  static Future<File>copyToTemp(String path)async{
    Directory tempDir = await getTemporaryDirectory();
    final tempFile = File('${tempDir.path}/${path.split("/").last}');
    if(await tempFile.exists()){
      return tempFile;
    }
    final bd = await rootBundle.load(path);
    await tempFile.writeAsBytes(bd.buffer.asUint8List(), flush: true);
    return tempFile;
  }
}

例子:

final track = await FFmpeg.concatenate(
      [
        "assets/audios/test1.mp3",
        "assets/audios/test2.mp3",
        "assets/audios/test3.mp3",
      ],
      output: "output.mp3"
    );

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2022-01-10
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多